spark sql 解析嵌套对象数组的json
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的初学者,所以试了好久都不成功,所以希望大家能指导我一下.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
没毛病.
根据你的原始的json,如果转换成表结构确实是这个格式,因为json里有两个属性,一个id,一个data,data是个列表,如果你不自己map,spark是不会知道你那个列表映射成表的结构是什么样子的
所以如果你想以表的结构展示你的json,需要自己map一下
最后表结构为:
你也可以在你
sqlContext.sql("SELECT data FROM behavior")
后进行map,关键点在那个列表想怎么展示
请问你这个有解决方案了么?
使用EXPLODE函数可以铺平数组