是否有一种通用的方法来读取 spark.json 中的多行 json。更具体地说,火花?

Posted

技术标签:

【中文标题】是否有一种通用的方法来读取 spark.json 中的多行 json。更具体地说,火花?【英文标题】:Is there a generic way to read the multiline json in spark. More specifically spark? 【发布时间】:2019-01-16 04:21:51 【问题描述】:

我有一个这样的多行 json

“_id”:“$oid”:“50b59cd75bed76f46522c34e”,“student_id”:0,“class_id”:2,“scores”:[“type”:“exam”,“score”:57.92947112575566 ,“类型”:“测验”,“分数”:21.24542588206755 ,“类型”:“家庭作业”,“分数”:68.19567810587429 ,“类型”:“家庭作业”,“分数”:67.95019716560351, "type" : "homework", "score" : 18.81037253352722

这只是 json 中的 1 行。还有其他文件。我正在寻找一种在 pyspark/spark 中读取此文件的方法。可以独立于json格式吗?

我需要将“分数”形式的输出作为单独的列,例如 score_exam 应该是值为 57.92947112575566 的一列, score_quiz 是另一列的值为 21.24542588206755。

感谢任何帮助。

【问题讨论】:

【参考方案1】:

是的。

使用多行真选项

from pyspark.sql.functions import explode, col

val df = spark.read.option("multiline", "true").json("multi.json")

你得到低于输出。

+--------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------------------+----------+
|_id                       |class_id|scores                                                                                                                                            |student_id|
+--------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------------------+----------+
|[50b59cd75bed76f46522c34e]|2       |[[57.92947112575566, exam], [21.24542588206755, quiz], [68.1956781058743, homework], [67.95019716560351, homework], [18.81037253352722, homework]]|0         |
+--------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------------------+----------+

添加这些行得到

  val df2= df.withColumn("scores",explode(col("scores")))
      .select(col("_id.*"), col("class_id"),col("scores.*"),col("student_id"))

+------------------------+--------+-----------------+--------+----------+
|$oid                    |class_id|score            |type    |student_id|
+------------------------+--------+-----------------+--------+----------+
|50b59cd75bed76f46522c34e|2       |57.92947112575566|exam    |0         |
|50b59cd75bed76f46522c34e|2       |21.24542588206755|quiz    |0         |
|50b59cd75bed76f46522c34e|2       |68.1956781058743 |homework|0         |
|50b59cd75bed76f46522c34e|2       |67.95019716560351|homework|0         |
|50b59cd75bed76f46522c34e|2       |18.81037253352722|homework|0         |
+------------------------+--------+-----------------+--------+----------+

请注意,我们正在使用 spark 中的“col”和“explode”函数,因此,您需要执行以下导入才能使这些函数正常工作。

from pyspark.sql.functions import explode, col

您可以在下面的页面上详细了解如何使用多行解析 JSON 文件。

https://docs.databricks.com/spark/latest/data-sources/read-json.html

谢谢

【讨论】:

我试过这个。很多人都回答了这个问题。但这不起作用。 您遇到什么错误?实际上,您提供的记录在一行中,我能够处理它并生成我的评论中指定的输出。 对不起,我不是说错误,但我需要以“分数”形式的输出作为单独的列,比如 score_exam 应该是一个值为 57.92947112575566 的列, score_quiz 另一个值为 21.24542588206755 的列 感谢您的回答,但这是特定于此 json 的。我想知道是否有一种通用的方法来解析这种类型的 json。这个答案非常适合这个 json,但我们可以概括它。 我已经尝试过,但由于它变得非常复杂,因此不可能通用解决方案。可能是用正确的陈述发布另一个问题,有人会回答

以上是关于是否有一种通用的方法来读取 spark.json 中的多行 json。更具体地说,火花?的主要内容,如果未能解决你的问题,请参考以下文章

是否有一种“正确”的方式来读取 CSV 文件 [重复]

核心数据对象比较

在 Scala 中是不是有一种通用的方式来记忆?

是否有通用的方法来读取spark中的多线json。更具体的是火花?

NET问答: 是否有通用的方法判断一个 Type 是 Number ?

是否有一种更简洁的 Dapper 方法来仅更新随 Dapper 更改的列?