Spark处理JSON数据

JSON数据示例

1593136280858|{“cm”{“ln”:"-55.0",“sv”:“V2.9.6”,“os”:“8.0.4”,“g”:“C6816QZ0@gmail.com”,“mid”:“489”,“nw”:“3G”,“l”:“es”,“vc”:“4”,“hw”:“640*960”,“ar”:“MX”,“uid”:“489”,“t”:“1593123253541”,“la”:“5.2”,“md”:“sumsung-18”,“vn”:“1.3.4”,“ba”:“Sumsung”,“sr”:“I”},“ap”:“app”,“et”:[{“ett”:“1593050051366”,“en”:“loading”,“kv”:{“extend2”:"",“loading_time”:“14”,“action”:“3”,“extend1”:"",“type”:“2”,“type1”:“201”,“loading_way”:“1”}},{“ett”:“1593108791764”,“en”:“ad”,“kv”:{“activityId”:“1”,“displayMills”:“78522”,“entry”:“1”,“action”:“1”,“contentType”:“0”}},{“ett”:“1593111271266”,“en”:“notification”,“kv”:{“ap_time”:“1593097087883”,“action”:“1”,“type”:“1”,“content”:""}},{“ett”:“1593066033562”,“en”:“active_background”,“kv”:{“active_source”:“3”}},{“ett”:“1593135644347”,“en”:“comment”,“kv”:{“p_comment_id”:1,“addtime”:“1593097573725”,“praise_count”:973,“other_id”:5,“comment_id”:9,“reply_count”:40,“userid”:7,“content”:“辑赤蹲慰鸽抿肘捎”}}]}

读取

//从HDFS上读取预存JSON文件
scala> val fileRDD = sc.textFile("hdfs://192.168.**.**:9000/test/op.1og")

拆分

//将读取的JSON的文件按|拆分,即取出开头的数字
scala> val jsonStrRDD = fileRDD.map(x=>x.split('|')).map(x=>(x(0),x(1)))
//将数字存放至最后,并添加字段名“id”
scala> val jsonRDD=jsonStrRDD.map(x=>{var jsonStr=x._2; jsonStr = jsonStr.substring(0,jsonStr.length-1);jsonStr+",\"id\":\""+x._1+"\"}" })

转DataFrema

scala> val jsonDF = jsonRDD.toDF
//jsonDF结构
root
 |-- value: string (nullable = true)



导包

import spark.implicits._
import org.apache.spark.sql._

拆分jsonDF

//通过get_json_object()可以获取字段中的字段
//将整个字段拆分成:cm、ap、et、id
scala> 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"))
//jsonDF2结构
root
 |-- cm: string (nullable = true)
 |-- ap: string (nullable = true)
 |-- et: string (nullable = true)
 |-- id: string (nullable = true)


拆分jsonDF2(get_json_object)

//同样使用get_json_object拆分
scala> 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")	
+-------------+---+------+------+-----+------------------+---+---+---+---+--------+---+---+-------------+-----+----------+-----+-------+---+--------------------+
|           id| ap|    ln|    sv|   os|                 g|mid| nw|  l| vc|      hw| ar|uid|            t|   la|        md|   vn|     ba| sr|                  et|
+-------------+---+------+------+-----+------------------+---+---+---+---+--------+---+---+-------------+-----+----------+-----+-------+---+--------------------+
|1593136280858|app| -55.0|V2.9.6|8.0.4|C6816QZ0@gmail.com|489| 3G| es|  4| 640*960| MX|489|1593123253541|  5.2|sumsung-18|1.3.4|Sumsung|  I|[{"ett":"15930500...|
|1593136280858|app|-114.9|V2.7.8|8.0.4|NW0S962J@gmail.com|490| 3G| pt|  8|640*1136| MX|490|1593121224789|-44.4|  Huawei-8|1.0.1| Huawei|  O|[{"ett":"15930632...|
+-------------+---+------+------+-----+------------------+---+---+---+---+--------+---+---+-------------+-----+----------+-----+-------+---+--------------------+

//jsonDF3结构
scala> jsonDF3.printSchema
root
 |-- id: string (nullable = true)
 |-- ap: string (nullable = true)
 |-- ln: string (nullable = true)
 |-- sv: string (nullable = true)
 |-- os: string (nullable = true)
 |-- g: string (nullable = true)
 |-- mid: string (nullable = true)
 |-- nw: string (nullable = true)
 |-- l: string (nullable = true)
 |-- vc: string (nullable = true)
 |-- hw: string (nullable = true)
 |-- ar: string (nullable = true)
 |-- uid: string (nullable = true)
 |-- t: string (nullable = true)
 |-- la: string (nullable = true)
 |-- md: string (nullable = true)
 |-- vn: string (nullable = true)
 |-- ba: string (nullable = true)
 |-- sr: string (nullable = true)
 |-- et: string (nullable = true) 

将指定字符串结构化(from_json)

//from_json:将字符串结构化
//将jsonDF3中的“et”结构化,取别名“event”
scala> 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")).show(false)
//jsonDF4结构
root
 |-- id: string (nullable = true)
 |-- ap: string (nullable = true)
 |-- ln: string (nullable = true)
 |-- sv: string (nullable = true)
 |-- os: string (nullable = true)
 |-- g: string (nullable = true)
 |-- mid: string (nullable = true)
 |-- nw: string (nullable = true)
 |-- l: string (nullable = true)
 |-- vc: string (nullable = true)
 |-- hw: string (nullable = true)
 |-- ar: string (nullable = true)
 |-- uid: string (nullable = true)
 |-- t: string (nullable = true)
 |-- la: string (nullable = true)
 |-- md: string (nullable = true)
 |-- vn: string (nullable = true)
 |-- ba: string (nullable = true)
 |-- sr: string (nullable = true)
 |-- event: array (nullable = true)
 |    |-- element: struct (containsNull = true)
 |    |    |-- ett: string (nullable = true)
 |    |    |-- en: string (nullable = true)
 |    |    |-- kv: string (nullable = true)

将字符串转列(explods)

//explods:行转列
//将“event”行转列
val scala> 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"))
root
 |-- id: string (nullable = true)
 |-- ap: string (nullable = true)
 |-- ln: string (nullable = true)
 |-- sv: string (nullable = true)
 |-- os: string (nullable = true)
 |-- g: string (nullable = true)
 |-- mid: string (nullable = true)
 |-- nw: string (nullable = true)
 |-- l: string (nullable = true)
 |-- vc: string (nullable = true)
 |-- hw: string (nullable = true)
 |-- ar: string (nullable = true)
 |-- uid: string (nullable = true)
 |-- t: string (nullable = true)
 |-- la: string (nullable = true)
 |-- md: string (nullable = true)
 |-- vn: string (nullable = true)
 |-- ba: string (nullable = true)
 |-- sr: string (nullable = true)
 |-- event: struct (nullable = true)
 |    |-- ett: string (nullable = true)
 |    |-- en: string (nullable = true)
 |    |-- kv: string (nullable = true)


重新排列

scala> 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").show(false)

//jsonDF6结构
root
 |-- id: string (nullable = true)
 |-- ap: string (nullable = true)
 |-- ln: string (nullable = true)
 |-- sv: string (nullable = true)
 |-- os: string (nullable = true)
 |-- g: string (nullable = true)
 |-- mid: string (nullable = true)
 |-- nw: string (nullable = true)
 |-- l: string (nullable = true)
 |-- vc: string (nullable = true)
 |-- hw: string (nullable = true)
 |-- ar: string (nullable = true)
 |-- uid: string (nullable = true)
 |-- t: string (nullable = true)
 |-- la: string (nullable = true)
 |-- md: string (nullable = true)
 |-- vn: string (nullable = true)
 |-- ba: string (nullable = true)
 |-- sr: string (nullable = true)
 |-- ett: string (nullable = true)
 |-- en: string (nullable = true)
 |-- kv: string (nullable = true)

展示处理后的数据

scala> jsonDF6.show
+-------------+---+------+------+-----+------------------+---+---+---+---+--------+---+---+-------------+-----+----------+-----+-------+---+-------------+-----------------+--------------------+
|           id| ap|    ln|    sv|   os|                 g|mid| nw|  l| vc|      hw| ar|uid|            t|   la|        md|   vn|     ba| sr|          ett|               en|                  kv|
+-------------+---+------+------+-----+------------------+---+---+---+---+--------+---+---+-------------+-----+----------+-----+-------+---+-------------+-----------------+--------------------+
|1593136280858|app| -55.0|V2.9.6|8.0.4|C6816QZ0@gmail.com|489| 3G| es|  4| 640*960| MX|489|1593123253541|  5.2|sumsung-18|1.3.4|Sumsung|  I|1593050051366|          loading|{"extend2":"","lo...|
|1593136280858|app| -55.0|V2.9.6|8.0.4|C6816QZ0@gmail.com|489| 3G| es|  4| 640*960| MX|489|1593123253541|  5.2|sumsung-18|1.3.4|Sumsung|  I|1593108791764|               ad|{"activityId":"1"...|
|1593136280858|app| -55.0|V2.9.6|8.0.4|C6816QZ0@gmail.com|489| 3G| es|  4| 640*960| MX|489|1593123253541|  5.2|sumsung-18|1.3.4|Sumsung|  I|1593111271266|     notification|{"ap_time":"15930...|
|1593136280858|app| -55.0|V2.9.6|8.0.4|C6816QZ0@gmail.com|489| 3G| es|  4| 640*960| MX|489|1593123253541|  5.2|sumsung-18|1.3.4|Sumsung|  I|1593066033562|active_background|{"active_source":...|
|1593136280858|app| -55.0|V2.9.6|8.0.4|C6816QZ0@gmail.com|489| 3G| es|  4| 640*960| MX|489|1593123253541|  5.2|sumsung-18|1.3.4|Sumsung|  I|1593135644347|          comment|{"p_comment_id":1...|
+-------------+---+------+------+-----+------------------+---+---+---+---+--------+---+---+-------------+-----+----------+-----+-------+---+-------------+-----------------+--------------------+

拆分KV字段

  • 由于kv中的字段是根据en字段所决定,所以需要根据不同情况拆分
  • 当en值为loadiing时:
scala> val  jsonDF6_kv_loading=jsonDF6.filter(x=>x.getAs[String]("en")=="loading").select($"id",$"ap",$"ln",$"sv",$"os",$"g",$"mid",$"nw",$"l",$"vc",$"hw",$"ar",$"uid",$"t",$"la",$"md",$"vn",$"ba",$"sr",$"ett",$"en",get_json_object($"kv","$.loading_time").alias("loading_time"),get_json_object($"kv","$.action").alias("action"),get_json_object($"kv","$.extend1").alias("extend1"),get_json_object($"kv","$.type").alias("type")).show(false)
//jsonDF6_kv_loading数据展示
+-------------+---+------+------+-----+------------------+---+---+---+---+--------+---+---+-------------+-----+----------+-----+-------+---+-------------+-------+------------+------+-------+----+
|id           |ap |ln    |sv    |os   |g                 |mid|nw |l  |vc |hw      |ar |uid|t            |la   |md        |vn   |ba     |sr |ett          |en     |loading_time|action|extend1|type|
+-------------+---+------+------+-----+------------------+---+---+---+---+--------+---+---+-------------+-----+----------+-----+-------+---+-------------+-------+------------+------+-------+----+
|1593136280858|app|-55.0 |V2.9.6|8.0.4|C6816QZ0@gmail.com|489|3G |es |4  |640*960 |MX |489|1593123253541|5.2  |sumsung-18|1.3.4|Sumsung|I  |1593050051366|loading|14          |3     |       |2   |
+-------------+---+------+------+-----+------------------+---+---+---+---+--------+---+---+-------------+-----+----------+-----+-------+---+-------------+-------+------------+------+-------+----+

  • 当en值为ad时:
scala> val  jsonDF6_kv_ad=jsonDF6.filter(x=>x.getAs[String]("en")=="ad").select($"id",$"ap",$"ln",$"sv",$"os",$"g",$"mid",$"nw",$"l",$"vc",$"hw",$"ar",$"uid",$"t",$"la",$"md",$"vn",$"ba",$"sr",$"ett",$"en",get_json_object($"kv","$.activityId").alias("activityId"),get_json_object($"kv","$.displayMills").alias("displayMills"),get_json_object($"kv","$.entry").alias("entry"),get_json_object($"kv","$.action").alias("action"),get_json_object($"kv","$.contentType").alias("contentType")).show(false)
//jsonDF6_kv_ad数据展示
+-------------+---+------+------+-----+------------------+---+---+---+---+--------+---+---+-------------+-----+----------+-----+-------+---+-------------+---+----------+------------+-----+------+-----------+
|id           |ap |ln    |sv    |os   |g                 |mid|nw |l  |vc |hw      |ar |uid|t            |la   |md        |vn   |ba     |sr |ett          |en |activityId|displayMills|entry|action|contentType|
+-------------+---+------+------+-----+------------------+---+---+---+---+--------+---+---+-------------+-----+----------+-----+-------+---+-------------+---+----------+------------+-----+------+-----------+
|1593136280858|app|-55.0 |V2.9.6|8.0.4|C6816QZ0@gmail.com|489|3G |es |4  |640*960 |MX |489|1593123253541|5.2  |sumsung-18|1.3.4|Sumsung|I  |1593108791764|ad |1         |78522       |1    |1     |0          |
+-------------+---+------+------+-----+------------------+---+---+---+---+--------+---+---+-------------+-----+----------+-----+-------+---+-------------+---+----------+------------+-----+------+-----------+

  • 当en值为comment时
  • 当en值为active_background时
  • 当en值为notification时
  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 使用Excel可以打开JSON文件,但是需要手动进行数据清洗和转换,不适合处理大量的JSON数据。 Python可以使用json库来读取和处理JSON数据,可以进行数据清洗、转换、筛选等操作。同时,Python还可以使用pandas库来进行数据分析和可视化。 Hive可以使用JSON SerDe来读取和处理JSON数据,可以进行数据清洗、转换、筛选等操作。同时,Hive还可以使用HQL语言进行数据分析和查询。 Spark可以使用Spark SQL来读取和处理JSON数据,可以进行数据清洗、转换、筛选等操作。同时,Spark还可以使用Spark MLlib来进行数据分析和机器学习。 ### 回答2: 在现如今大数据时代,我们面临着大量的数据存储和处理问题。而其中处理JSON数据就是我们最常见的需求之一。为此,我们现在可以使用几种不同的工具进行JSON数据处理。其中,最流行的四种工具包括Excel、Python、Hive和Spark。 首先,“Excel”是一种非常经典的电子表格软件,对于JSON数据处理也可以相当的有用。用户可以选择将JSON数据转换成CSV格式或者Excel的标准格式,然后使用Excel进行数据处理。这种方式的优点在于易于上手,而且操作简单。但是,对于大规模数据处理,Excel的速度会变慢。 其次,“Python”是一种高级编程语言,经常用于大数据处理和分析。Python实现JSON数据处理可以使用多种库如json库、pandas库和numpy库等。这样可以将JSON数据转换为Python可操控的数据结构,然后进行后续的数据处理和分析。Python对于JSON数据处理的效率很高,可以应对大规模数据处理。 然后,“Hive”是一个基于Hadoop的数据仓库工具。它是一种开源的分布式数据存储和处理解决方案,可以用来管理大规模数据。Hive的强项是可伸缩性和性能。它可以在大规模数据中进行JSON文件的逐行处理,实现数据挖掘和分析。 最后,“Spark”是一个Apache基金会的大数据计算框架。它基于内存运行,强调处理大规模数据的速度和效率。Spark的优点在于它可以通过多种语言如Python、Java和Scala进行数据处理,同时它也提供了丰富的API和工具库。使用Spark可以将JSON数据进行处理,支持复杂的分析和计算。 总之,以上四种工具都可以用来处理JSON数据,并且都有各自的优缺点。用户可以根据需求和要求选择合适的工具。对于大规模数据处理,需要使用高效的工具如Python、Hive和Spark等。如果数据量不大,Excel亦可胜任。 ### 回答3: 在现今的大数据时代,处理Json数据是非常常见的任务,而Excel、Python、Hive以及Spark都是处理Json数据的常见工具。 Excel是众所周知的数据分析软件,它可以读取Json格式的数据并进行分析。可以通过Excel中的“数据”选项卡,在“来自文本/ CSV”、“来自网页”、“来自其他来源”三个选项中选择“来自文本/ CSV”,导入Json文件,然后对数据进行排序、筛选、图表制作等操作。 Python是专业的编程语言,在对Json数据处理方面拥有非常强大的能力。Python可以使用Json模块进行读取、解析、转换和序列化Json数据,还可以使用第三方库如pandas、numpy、matplotlib等进一步进行数据处理和可视化。 Hive是一个数据仓库工具,可以对半结构化和非结构化数据进行复杂的ETL操作。Hive支持处理Json格式的数据,可以使用通用的语句如SELECT、INSERT等进行查询和操作。对于较大的Json文件,可以使用Hive的分区技术进行数据分区,从而提高查询效率。 Spark是目前最火的大数据处理框架,支持快速、高效的处理Json数据Spark提供了Json格式文件的读写API,同时还提供了专门用于处理Json数据的函数库。Spark的强大并行处理能力可以让用户处理海量的Json数据,并在分布式环境下快速进行计算和分析。 总之,Excel、Python、Hive和Spark都是常见的处理Json数据的工具,各有其优势。用户可以根据不同的需求和数据规模,选择不同的工具进行处理

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值