使用Spark解析JSON文件并提取键和值

3

我是新手,对Spark不熟悉。我试图使用SparkSQL解析下面提到的JSON文件,但失败了。有人能帮我解决吗?

输入JSON:

[{"num":"1234","Projections":[{"Transactions":[{"14:45":0,"15:00":0}]}]}]

期望输出:

1234 14:45 0\n
1234 15:00 0

我尝试了以下代码,但它没有起作用。
val sqlContext = new SQLContext(sc)
val df = sqlContext.read.json("hdfs:/user/aswin/test.json").toDF();
val sql_output = sqlContext.sql("SELECT num, Projections.Transactions FROM df group by Projections.TotalTransactions ")
sql_output.collect.foreach(println)

输出:

[01532,WrappedArray(WrappedArray([0,0]))]

你能分享一下你已经尝试过什么吗?我们可以帮助你找到代码中的错误。 - Mariusz
Added in the question. - user3792699
为什么你在收集数据?尝试使用 sql_output.show() 来查看数据框。 - OneCricketeer
同时,您选择了2列,但期望3列? - OneCricketeer
我已经尝试了show命令,并得到了以下响应。+-----+--------------------+ | NUM| Transactions| +-----+--------------------+ |01532|[WrappedArray([0,...| +-----+--------------------+我不知道如何在SQL查询中选择像14:45这样的键。 - user3792699
1个回答

2

Spark会将你的{"14:45":0,"15:00":0}映射识别为结构,所以读取数据的唯一方式可能是手动指定模式:

>>> from pyspark.sql.types import *
>>> schema = StructType([StructField('num', StringType()), StructField('Projections', ArrayType(StructType([StructField('Transactions', ArrayType(MapType(StringType(), IntegerType())))])))])

然后您可以查询这个临时表,使用多重分裂来获取结果:

>>> sqlContext.read.json('sample.json', schema=schema).registerTempTable('df')
>>> sqlContext.sql("select num, explode(col) from (select explode(col.Transactions), num from (select explode(Projections), num from df))").show()
+----+-----+-----+
| num|  key|value|
+----+-----+-----+
|1234|14:45|    0|
|1234|15:00|    0|
+----+-----+-----+

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接