spark清洗过滤json格式

spark清洗过滤json格式

待处理数据内容如下
在这里插入图片描述
将该文件上传至hdfs

[root@hadoop30 kb09file]# hdfs dfs -put /opt/kb09file/op.log /kb09file

在这里插入图片描述
验证是否上传成功

[root@hadoop30 kb09file]# hdfs dfs -ls /kb09file

在这里插入图片描述
启动spark-shell

[root@hadoop30 kb09file]# spark-shell

从hdfs查看op.log文件内容

sc.textFile("hdfs://hadoop30:9000/kb09file/op.log").collect.foreach(println)

在这里插入图片描述
从hdfs读取op.log文件

val fileRDD=sc.textFile("hdfs://hadoop30:9000/kb09file/op.log")

使用split以 | 分隔

val jsonStrRDD=fileRDD.map(x=>x.split('|')).map(x=>(x(0),x(1)))

进行字符串拼接

val jsonRDD=jsonStrRDD.map(x=>{var jsonStr=x._2; jsonStr=jsonStr.substring(0,jsonStr.length-1);jsonStr+",\"id\":\""+x._1+"\"}"})

转成dataframe

val jsonDF=jsonRDD.toDF
jsonDF.printSchema

在这里插入图片描述

jsonDF.show

在这里插入图片描述
导入需要的包

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

通过get_json_object获取对象cm,ap,et,id

val jsonDF2=jsonDF.select(get_json_object($"value","$.cm").alias("cm"),get_json_object($"value","$.ap").alias("ap"),get_json_object($"value","$.et").alias("et"),get_json_object($"value","$.id").alias("id"))

在这里插入图片描述
通过get_json_object进一步获取对象id,ap,ln,sv,os,g,mid,nw,l,vc,hw,ar,uid,t,la,md,vn,ba,sr,et

val jsonDF3=jsonDF2.select($"id",$"ap",get_json_object($"cm","$.ln").alias("ln"),get_json_object($"cm","$.sv").alias("sv"),get_json_object($"cm","$.os").alias("os"),get_json_object($"cm","$.g").alias("g"),get_json_object($"cm","$.mid").alias("mid"),get_json_object($"cm","$.nw").alias("nw"),get_json_object($"cm","$.l").alias("l"),get_json_object($"cm","$.vc").alias("vc"),get_json_object($"cm","$.hw").alias("hw"),get_json_object($"cm","$.ar").alias("ar"),get_json_object($"cm","$.uid").alias("uid"),get_json_object($"cm","$.t").alias("t"),get_json_object($"cm","$.la").alias("la"),get_json_object($"cm","$.md").alias("md"),get_json_object($"cm","$.vn").alias("vn"),get_json_object($"cm","$.ba").alias("ba"),get_json_object($"cm","$.sr").alias("sr"),$"et")
jsonDF3.show 

在这里插入图片描述
通过StructType和StructField查询jsonDF3里的ett,en,kv字段内容

jsonDF3.select(from_json($"et",ArrayType(StructType(StructField("ett",StringType)::StructField("en",StringType)::StructField("kv",StringType)::Nil)))alias("event")).show(false)

在这里插入图片描述
查询id,ap,ln,sv,os,g,mid,nw,l,vc,hw,ar,uid,t,la,md,vn,ba,sr,ett,en,kv字段内容

val jsonDF4 = jsonDF3.select($"id",$"ap",$"ln",$"sv",$"os",$"g",$"mid",$"nw",$"l",$"vc",$"hw",$"ar",$"uid",$"t",$"la",$"md",$"vn",$"ba",$"sr",from_json($"et",ArrayType(StructType(StructField("ett",StringType)::StructField("en",StringType)::StructField("kv",StringType)::Nil))).alias("event"))
val jsonDF5=jsonDF4.select($"id",$"ap",$"ln",$"sv",$"os",$"g",$"mid",$"nw",$"l",$"vc",$"hw",$"ar",$"uid",$"t",$"la",$"md",$"vn",$"ba",$"sr",explode($"event").alias("event"))
val jsonDF6=jsonDF5.select($"id",$"ap",$"ln",$"sv",$"os",$"g",$"mid",$"nw",$"l",$"vc",$"hw",$"ar",$"uid",$"t",$"la",$"md",$"vn",$"ba",$"sr",$"event.ett",$"event.en",$"event.kv")
jsonDF6.show(false)

在这里插入图片描述
过滤en里为loading的内容

val jsonDF7=jsonDF6.filter(jsonDF6("en")==="loading").select($"id",$"ap",$"ln",$"sv",$"os",$"g",$"mid",$"nw",$"l",$"vc",$"hw",$"ar",$"uid",$"t",$"la",$"md",$"vn",$"ba",$"sr",$"ett",$"en",$"kv")
jsonDF7.show(false)

在这里插入图片描述
通过ArrayType,StructType,StructField进一步获取kv中的对象内容

val jsonDF8=jsonDF7.select($"id",$"ap",$"ln",$"sv",$"os",$"g",$"mid",$"nw",$"l",$"vc",$"hw",$"ar",$"uid",$"t",$"la",$"md",$"vn",$"ba",$"sr",$"ett",$"en",from_json($"kv",ArrayType(StructType(StructField("extend2",StringType)::StructField("loading_time",StringType)::StructField("action",StringType)::StructField("extend1",StringType)::StructField("type",StringType)::StructField("type1",StringType)::StructField("loading_way",StringType)::Nil))).alias("kv"))
jsonDF8.show(false)

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值