Alo*_*lon 16 json scala apache-spark apache-spark-sql
我有一个 json 文件:
{
"a": {
"b": 1
}
}
Run Code Online (Sandbox Code Playgroud)
我正在尝试阅读它:
val path = "D:/playground/input.json"
val df = spark.read.json(path)
df.show()
Run Code Online (Sandbox Code Playgroud)
但是得到一个错误:
线程“main”org.apache.spark.sql.AnalysisException 中的异常:自 Spark 2.3 起,当引用的列仅包含内部损坏的记录列(默认名为 _corrupt_record)时,不允许对原始 JSON/CSV 文件进行查询。例如: spark.read.schema(schema).json(file).filter($"_corrupt_record".isNotNull).count() 和 spark.read.schema(schema).json(file).select("_corrupt_record" )。展示()。相反,您可以缓存或保存解析的结果,然后发送相同的查询。例如, val df = spark.read.schema(schema).json(file).cache() 然后 df.filter($"_corrupt_record".isNotNull).count().;
所以我尝试按照他们的建议缓存它:
val path = "D:/playground/input.json"
val df = spark.read.json(path).cache()
df.show()
Run Code Online (Sandbox Code Playgroud)
但我不断收到同样的错误。
小智 30
您可以尝试这两种方式中的任何一种。
选项 1:单行 JSON,如上面@Avishek Bhattacharya 的回答。
Option-2:在代码中添加读取多行 JSON 的选项,如下所示。您也可以阅读嵌套属性,如下所示。
val df = spark.read.option("multiline","true").json("C:\\data\\nested-data.json")
df.select("a.b").show()
Run Code Online (Sandbox Code Playgroud)
这是选项 2 的输出。
20/07/29 23:14:35 INFO DAGScheduler: Job 1 finished: show at NestedJsonReader.scala:23, took 0.181579 s
+---+
| b|
+---+
| 1|
+---+
Run Code Online (Sandbox Code Playgroud)
Avi*_*rya 24
问题出在 JSON 文件上。文件:"D:/playground/input.json"看起来像你描述的那样
{
"a": {
"b": 1
}
}
Run Code Online (Sandbox Code Playgroud)
这个不对。Spark 在处理 json 数据时将每个新行视为一个完整的 json。因此它失败了。
您应该通过删除所有空格和换行符以紧凑的形式将完整的 json 保留在一行中。
喜欢
{"a":{"b":1}}
Run Code Online (Sandbox Code Playgroud)
如果您想在一个文件中包含多个 json,请保持它们像这样
{"a":{"b":1}}
{"a":{"b":2}}
{"a":{"b":3}} ...
Run Code Online (Sandbox Code Playgroud)
有关更多信息,请参阅
| 归档时间: |
|
| 查看次数: |
14593 次 |
| 最近记录: |