spark如何读取包含json格式+普通文本格式的文本并转换成DataFrame

  我们知道spark读取文件并转换成DataFrame可以通过sparkSession.read.format直接读取,但是当我们读取的是普通文本,并且内容包含普通文本及json格式的文档,如下图abc.log文档,如何读取并转换?

12334 hehehe {"name":"zhangsan","age":"32"} 1995-6-7
123423 xixi {"name":"lisi","age":"32"} 2000-9-8
234435 cici {"name":"wangwu","age":"34"} 2020-9-7
23432 cici {"name":"zhaoliu","age":"23"} 1997-4-3

文档存在json格式,首先需要导入解析json格式依赖

import org.apache.spark.sql.functions._

步骤如下:

def main(args: Array[String]): Unit = {
	val spark = SparkSession.builder().master("local[1]").appName("mytest").getOrCreate()
	import spark.implicits._   //记得要加,否则下面不能取值

	//使用sparkContext读取文件
	val txt = spark.sparkContext.textFile("file:///f:/abc.log")

	//对文件用空格进行分割,拿到每个字段的值后,转换成dataframe格式
	val dd = txt.map(_.split(" ")).map(x=>(x(0),x(1),x(2),x(3))).toDF("no","action","info","times")


//此时,表格已经形成如下,剩下的我们只需要对其中json格式的一列进行解析
//    +------+------+--------------------+--------+
//    |    no|action|                info|   times|
//    +------+------+--------------------+--------+
//    | 12334|hehehe|{"name":"zhangsan...|1995-6-7|
//    |123423|  xixi|{"name":"lisi","a...|2000-9-8|
//    |234435|  cici|{"name":"wangwu",...|2020-9-7|
//    | 23432|  cici|{"name":"zhaoliu"...|1997-4-3|

	//选取字段并解析
	dd.select($"no",$"action",
      	get_json_object($"info","$.name").as("name"),
      	get_json_object($"info","$.age").as("age"),
      	$"times").show()
}
//最终读表控制台输出如下
+------+------+--------+---+--------+
|    no|action|    name|age|   times|
+------+------+--------+---+--------+
| 12334|hehehe|zhangsan| 32|1995-6-7|
|123423|  xixi|    lisi| 32|2000-9-8|
|234435|  cici|  wangwu| 34|2020-9-7|
| 23432|  cici| zhaoliu| 23|1997-4-3|
+------+------+--------+---+--------+
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值