【问题标题】:SparkSQL: Ignoring invalid json filesSparkSQL:忽略无效的 json 文件
【发布时间】:2014-11-20 09:25:30
【问题描述】:

我正在使用 SparkSQL 加载一堆 JSON 文件,但有些有问题。

我想继续处理其他文件,同时忽略坏文件,我该怎么做?

我尝试使用 try-catch 但仍然失败。示例:

try {
    val sqlContext = new org.apache.spark.sql.SQLContext(sc)
    import sqlContext._

    val jsonFiles=sqlContext.jsonFile("/requests.loading")
} catch {
    case _: Throwable => // Catching all exceptions and not doing anything with them
}

我失败了:

14/11/20 01:20:44 INFO scheduler.TaskSetManager: Starting task 3065.0 in stage 1.0 (TID 6150, HDdata2, NODE_LOCAL, 1246 bytes)<BR>
14/11/20 01:20:44 WARN scheduler.TaskSetManager: Lost task 3027.1 in stage 1.0 (TID 6130, HDdata2): com.fasterxml.jackson.core.JsonParseException: Unexpected end-of-input: was expecting closing quote for a string value
 at [Source: java.io.StringReader@753ab9f1; line: 1, column: 1805]

【问题讨论】:

  • 确定它真的失败了吗?这些日志条目分别是 INFO 和 WARN 行。 Spark 日志记录非常冗长,这两行并不能说服我没有捕获到异常。如果我看到一条 ERROR 行,情况会有所不同,但我个人会将println 放入 catch 正文中以确保。
  • 是的,我很肯定它失败了。我首先通过过滤掉坏的 json 来处理它,但后来我被告知 1.2 版现在可以忽略格式错误的 json 字符串,所以我切换到 1.2。

标签: apache-spark apache-spark-sql


【解决方案1】:

如果您使用的是 Spark 1.2,Spark SQL 将为您处理那些损坏的 JSON 记录。这是一个例子......

// requests.loading has some broken records
val jsonFiles=sqlContext.jsonFile("/requests.loading")
// Look at the schema of jsonFiles, you will see a new column called "_corrupt_record", which holds all broken JSON records
// jsonFiles.printSchema
// Register jsonFiles as a table
jsonFiles.registerTempTable("jsonTable")
// To query all normal records
sqlContext.sql("SELECT * FROM jsonTable WHERE _corrupt_record IS NULL")
// To query all broken JSON records
sqlContext.sql("SELECT _corrupt_record FROM jsonTable WHERE _corrupt_record IS NOT NULL")

【讨论】:

    猜你喜欢
    • 2015-02-23
    • 2020-11-29
    • 1970-01-01
    • 2017-01-01
    • 2021-04-13
    • 2013-08-04
    • 1970-01-01
    • 2022-07-23
    • 1970-01-01
    相关资源
    最近更新 更多