【问题标题】:Parsing JSON file and extracting keys and values using Spark使用 Spark 解析 JSON 文件并提取键和值
【发布时间】:2017-06-20 10:54:25
【问题描述】:

我是新来的火花。我尝试使用 SparkSQL 在 Spark 中解析下面提到的 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]))]

【问题讨论】:

  • 你能分享你已经尝试过的东西吗?我们可以帮助您找到代码中的错误。
  • 在问题中添加。
  • 你为什么要收藏?尝试 sql_output.show() 作为数据框
  • 另外,您选择了 2 列,但期望 3 列?
  • 我已尝试使用 show 并得到以下响应。 +-----+--------+ |号码|交易| +-----+--------+ |01532|[WrappedArray([0,...| +-----+-- ------------------+ 我不知道如何在 sql 查询中选择像 14:45 这样的键

标签: json apache-spark pyspark apache-spark-sql spark-dataframe


【解决方案1】:

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|
+----+-----+-----+

【讨论】:

    猜你喜欢
    • 2020-10-06
    • 2020-01-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多