在线观看不卡亚洲电影_亚洲妓女99综合网_91青青青亚洲娱乐在线观看_日韩无码高清综合久久

鍍金池/ 問答/人工智能  Java  Scala  網(wǎng)絡(luò)安全/ spark sql 解析嵌套對象數(shù)組的json

spark sql 解析嵌套對象數(shù)組的json

1.現(xiàn)在有json數(shù)據(jù)如下

{"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里是app的激活時間,目的是分析每個app的總激活時間
我使用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查詢
    
    appActiveTime.show(100,100)  //  打印dataFrame
    appActiveTime.rdd.foreach(println)  //  打印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])]

而我想把數(shù)據(jù)轉(zhuǎn)化成

com.browser1 60000 
com.browser1 60000 
com.browser 12075000 
com.browser 12075000 
.......

就是想要把rdd中每行的數(shù)組元素變成一行一個. 當(dāng)然也可以是其他易于分析的結(jié)構(gòu)

因為本人是spark和scala的初學(xué)者,所以試了好久都不成功,所以希望大家能指導(dǎo)我一下.

回答
編輯回答
陌如玉

使用EXPLODE函數(shù)可以鋪平數(shù)組

SELECT EXPLODE(data) FROM behavior
2018年9月3日 12:56
編輯回答
殘淚

沒毛病.
根據(jù)你的原始的json,如果轉(zhuǎn)換成表結(jié)構(gòu)確實是這個格式,因為json里有兩個屬性,一個id,一個data,data是個列表,如果你不自己map,spark是不會知道你那個列表映射成表的結(jié)構(gòu)是什么樣子的

+--------------------+---+
|                data| id|
+--------------------+---+
|[[60000, com.brow...| 11|
+--------------------+---+

所以如果你想以表的結(jié)構(gòu)展示你的json,需要自己map一下

   val session = SparkSession.builder().config(sc).getOrCreate()
    try {
      val schema = StructType(Seq(
        StructField("id", LongType),
        StructField("package", StringType),
        StructField("activetime", LongType)
      ))

      val encoder = RowEncoder(schema)

      val df = session.read.json("file:\\\\\\E:/anc.json")
        .flatMap(new FlatMapFunction[Row, Row] {
          override def call(r: Row): util.Iterator[Row] = {
            val list = new util.ArrayList[Row]()
            val datas = r.getAs[mutable.WrappedArray.ofRef[Row]]("data")
            datas.foreach(data => {
              list.add(Row(r.getAs[Long]("id"), data.getAs[Long](1), data.getAs[String](0)))
            })
            list.iterator()
          }
        }, encoder)

      df.show()

最后表結(jié)構(gòu)為:

+---+------------+----------+
| id|     package|activetime|
+---+------------+----------+
| 11|com.browser1|     60000|
| 11|com.browser6|   1205000|
| 11|com.browser7|   1205000|
+---+------------+----------+

你也可以在你
sqlContext.sql("SELECT data FROM behavior")
后進行map,關(guān)鍵點在那個列表想怎么展示

2018年8月24日 07:20
編輯回答
青黛色

請問你這個有解決方案了么?

2017年1月11日 05:03