gpt4 book ai didi

json - 如何使用Spark SQL解析对象的JSON数组

转载 作者:行者123 更新时间:2023-11-30 23:46:08 32 4
gpt4 key购买 nike

现在具有JSON数据,如下所示

{"Id":11,"data":[{"package":"com.browser1","activetime":60000},{"package":"com.browser6","activetime":1205000},{"package":"com.browser7","activetime":1205000}]}
{"Id":12,"data":[{"package":"com.browser1","activetime":60000},{"package":"com.browser6","activetime":1205000}]}
......

此JSON是应用程​​序的激活时间,其目的是分析每个应用程序的总激活时间

我使用sparK SQL解析JSON

斯卡拉
val sqlContext = sc.sqlContext
val behavior = sqlContext.read.json("behavior-json.log")
behavior.cache()
behavior.createOrReplaceTempView("behavior")
val appActiveTime = sqlContext.sql ("SELECT data FROM behavior") // SQL query
appActiveTime.show (100100) // print dataFrame
appActiveTime.rdd.foreach(println) // print RDD

但是打印的dataFrame是这样的


+----------------------------------------------------------------------+

| data|

+----------------------------------------------------------------------+

| [[60000, com.browser1], [12870000, com.browser]]|

| [[60000, com.browser1], [120000, com.browser]]|

| [[60000, com.browser1], [120000, com.browser]]|

| [[60000, com.browser1], [1207000, com.browser]]|

| [[120000, com.browser]]|

| [[60000, com.browser1], [1204000, com.browser5]]|

| [[60000, com.browser1], [12075000, com.browser]]|

| [[60000, com.browser1], [120000, com.browser]]|

| [[60000, com.browser1], [1204000, com.browser]]|

| [[60000, com.browser1], [120000, com.browser]]|

| [[60000, com.browser1], [1201000, com.browser]]|

| [[1200400, com.browser5]]|

| [[60000, com.browser1], [1200400, com.browser]]|

|[[60000, com.browser1], [1205000, com.browser6], [1205000, com.browser7]]|



RDD是这样的


[WrappedArray ([60000, com.browser1], [60000, com.browser1])]

[WrappedArray ([120000, com.browser])]

[WrappedArray ([60000, com.browser1], [1204000, com.browser5])]

[WrappedArray ([12075000, com.browser], [12075000, com.browser])]



我想将数据转换为


Com.browser1 60000

Com.browser1 60000

Com.browser 12075000

Com.browser 12075000

...



我想将RDD中每行的数组元素转换为一行。当然,它可以是易于分析的另一种结构。

因为我只学过很多spark和Scala,所以我尝试了很长时间但失败了,所以希望您能为我提供指导。

最佳答案

从给定的json数据中,您可以使用dataframe查看printSchema的架构并使用它

appActiveTime.printSchema()
root
|-- data: array (nullable = true)
| |-- element: struct (containsNull = true)
| | |-- activetime: long (nullable = true)
| | |-- package: string (nullable = true)

由于您具有 array,因此需要对数据进行 explode并选择如下所示的struct字段
import org.apache.spark.sql.functions._
appActiveTime.withColumn("data", explode($"data"))
.select("data.*")
.show(false)

输出:
+----------+------------+
|activetime| package|
+----------+------------+
| 60000|com.browser1|
| 1205000|com.browser6|
| 1205000|com.browser7|
| 60000|com.browser1|
| 1205000|com.browser6|
+----------+------------+

希望这可以帮助!

关于json - 如何使用Spark SQL解析对象的JSON数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49133252/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com