账号密码登录
微信安全登录
微信扫描二维码登录

登录后绑定QQ、微信即可实现信息互通

手机验证码登录
找回密码返回
邮箱找回 手机找回
注册账号返回
其他登录方式
分享
  • 收藏
    X
    spark sql 解析嵌套对象数组的json
    120
    0

    1.现在有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里是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])]

    而我想把数据转化成

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

    就是想要把rdd中每行的数组元素变成一行一个. 当然也可以是其他易于分析的结构

    因为本人是spark和scala的初学者,所以试了好久都不成功,所以希望大家能指导我一下.

    2
    打赏
    收藏
    点击回答
        全部回答
    • 0
    • 队友最骚 普通会员 1楼

      在Spark SQL中,我们可以使用JSON functions来解析嵌套的对象数组。以下是一个示例:

      sql SELECT column1, column2, JSON_EXTRACT(json_column, '$[*]') as nested_json FROM table_name

      在这个例子中,json_column 是一个包含嵌套对象数组的列。JSON_EXTRACT 函数被用来提取每个对象数组的元素。'$[*]' 是一个特殊的字符串,表示我们想要提取的是所有数组的元素,而不是数组的最后一个元素。这个字符串也可以被替换为 ['*'] 来提取所有的元素。

      注意,这个查询假设你的JSON数据是以键值对的形式存储的,每个键都是一个数组。如果你的JSON数据是以其他形式存储的,你可能需要使用不同的函数来解析它。

    更多回答
    扫一扫访问手机版
    • 回到顶部
    • 回到顶部