【问题标题】:Since Spark 2.3, the queries from raw JSON/CSV files are disallowed when the referenced columns only include the internal corrupt record column从 Spark 2.3 开始,当引用的列仅包含内部损坏记录列时,不允许来自原始 JSON/CSV 文件的查询
【发布时间】:2019-12-18 11:22:55
【问题描述】:

我有一个 json 文件:

{
  "a": {
    "b": 1
  }
}

我正在阅读它:

val path = "D:/playground/input.json"
val df = spark.read.json(path)
df.show()

但出现错误:

线程“主”org.apache.spark.sql.AnalysisException 中的异常: 从 Spark 2.3 开始,不允许来自原始 JSON/CSV 文件的查询 当引用的列仅包含内部损坏记录时 列(默认命名为 _corrupt_record)。例如: spark.read.schema(schema).json(file).filter($"_corrupt_record".isNotNull).count() 和 spark.read.schema(schema).json(file).select("_corrupt_record").show()。 相反,您可以缓存或保存解析的结果,然后发送 相同的查询。例如,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()

但我不断收到同样的错误。

【问题讨论】:

  • 错误清楚地表明问题在于您的 JSON 未正确读取。原因是 Spark 需要特定格式:“请注意,作为 json 文件提供的文件不是典型的 JSON 文件。每一行必须包含一个单独的、自包含的有效JSON 对象。” - documentation - 另外,在 read 方法的 Scaladoc 上,您可以看到在这种情况下很有用的 multiLine 选项。
  • 请查看link 了解更多信息和解决方案。
  • 痛苦的问题解释得不好恕我直言。
  • @LuisMiguelMejíaSuárez 谢谢我不知道。现在它正在工作。请写下您的评论作为答案,我会接受。

标签: json scala apache-spark apache-spark-sql


【解决方案1】:

您可以尝试这两种方法中的任何一种。

Option-1:@Avishek Bhattacharya 在上面回答的单行 JSON。

Option-2:在代码中添加读取多行 JSON 的选项,如下所示。您也可以读取嵌套属性,如下所示。

val df = spark.read.option("multiline","true").json("C:\\data\\nested-data.json")
df.select("a.b").show()

这是 Option-2 的输出。

20/07/29 23:14:35 INFO DAGScheduler: Job 1 finished: show at NestedJsonReader.scala:23, took 0.181579 s
+---+
|  b|
+---+
|  1|
+---+

【讨论】:

    【解决方案2】:

    问题出在 JSON 文件上。该文件:"D:/playground/input.json" 看起来就像您描述的那样

    {
      "a": {
      "b": 1
      }
    }
    

    这是不对的。 Spark 在处理 json 数据时将每个新行视为一个完整的 json。因此它失败了。

    您应该通过删除所有空格和换行符将完整的 json 以紧凑的形式保存在一行中。

    喜欢

    {"a":{"b":1}}
    

    如果你想在一个文件中保存多个 json,请保持这样

    {"a":{"b":1}}
    {"a":{"b":2}}
    {"a":{"b":3}} ...
    

    更多信息see

    【讨论】:

      【解决方案3】:

      这个错误意味着两件事:

      1-要么你的文件格式不是你想象的那样(你使用了错误的方法,比如它的text,但你错误地使用了json方法)

      2-您的文件不符合您所使用格式的标准(当您使用正确的方法获得正确的格式时),这通常发生在 json 中。

      【讨论】:

        猜你喜欢
        • 2020-04-07
        • 1970-01-01
        • 2020-04-14
        • 1970-01-01
        • 2020-02-26
        • 1970-01-01
        • 2018-07-06
        • 2021-11-06
        • 2017-05-18
        相关资源
        最近更新 更多