Pyspark 中的 JSON 文件解析

Posted

技术标签:

【中文标题】Pyspark 中的 JSON 文件解析【英文标题】:JSON file parsing in Pyspark 【发布时间】:2017-01-09 08:33:45 【问题描述】:

我对 Pyspark 很陌生。我尝试使用以下代码解析 JSON 文件

from pyspark.sql import SQLContext
sqlContext = SQLContext(sc)
df = sqlContext.read.json("file:///home/malwarehunter/Downloads/122116-path.json")
df.printSchema()

输出如下。

根 |-- _corrupt_record: string (nullable = true)

df.show()

输出如下所示

+--------------------+
|     _corrupt_record|
+--------------------+
|                   |
|  "time1":"2...|
|  "time2":"201...|
|    "step":0.5,|
|          "xyz":[|
|                   |
|      "student":"00010...|
|      "attr...|
|        [ -2.52, ...|
|        [ -2.3, -...|
|        [ -1.97, ...|
|        [ -1.27, ...|
|        [ -1.03, ...|
|        [ -0.8, -...|
|        [ -0.13, ...|
|        [ 0.09, -...|
|        [ 0.54, -...|
|        [  1.1, -...|
|        [ 1.34, 0...|
|        [ 1.64, 0...|
+--------------------+
only showing top 20 rows

Json 文件如下所示。


  "time1":"2016-12-16T00:00:00.000",

  "time2":"2016-12-16T23:59:59.000",

  "step":0.5,

   "xyz":[

    
     "student":"0001025D0007F5DB",
      "attr":[
    [ -2.52, -1.17 ],
    [ -2.3, -1.15 ],
    [ -1.97, -1.19 ],
    [ 10.16, 4.08 ],
    [ 10.23, 4.87 ],
    [ 9.96, 5.09 ] ]
,

  "student":"0001025D0007F5DC",
  "attr":[
    [ -2.58, -0.99 ],
    [ 10.12, 3.89 ],
    [ 10.27, 4.59 ],
    [ 10.05, 5.02 ] ]

]

你能帮我解析这个并创建一个这样的数据框吗?

【问题讨论】:

json 似乎是每个对象多行。如果是这样,则 spark 不支持(假设每个对象只有一行)。 【参考方案1】:

火花 >= 2.2

您可以为 JSON 阅读器使用 multiLine 参数:

spark.read.json(path_to_input, multiLine=True)

火花

有一个几乎通用但相当昂贵的解决方案,可用于读取多行 JSON 文件:

使用SparkContex.wholeTextFiles读取数据。 删除键(文件名)。 将结果传递给DataFrameReader.json

只要您的数据没有其他问题,它就可以解决问题:

spark.read.json(sc.wholeTextFiles(path_to_input).values())

【讨论】:

【参考方案2】:

我遇到了类似的问题。当 Spark 读取 Json 文件时,它希望每一行都是一个单独的 JSON 对象。因此,如果您尝试加载格式精美的 JSON 文件,它将失败。我的工作是缩小 Spark 正在读取的 JSON 文件。

【讨论】:

以上是关于Pyspark 中的 JSON 文件解析的主要内容,如果未能解决你的问题,请参考以下文章

在pyspark中的一行中解析多个json

如何解析 pyspark 的 DataStreamReader 中的 json 字符串列并创建数据框

通过使用pyspark将列转换为行来解析数据框中的Json字符串列表?

如何使用正则表达式从 PySpark databricks 笔记本中的文件中解析表名

Pyspark 解析高度嵌套的 json (Prometheus)

PySpark 使用 RDD 和 json.load 解析 Json