在 spark 中跳过 hive 表中丢失的文件以避免 FileNotFoundException

Posted

技术标签:

【中文标题】在 spark 中跳过 hive 表中丢失的文件以避免 FileNotFoundException【英文标题】:Skip missing files from hive table in spark to avoid FileNotFoundException 【发布时间】:2019-07-30 11:52:07 【问题描述】:

我正在使用spark.sql() 读取表格,然后尝试打印计数。 但有些文件丢失或直接从 HDFS 中删除。

Spark 失败并出现以下错误:

Caused by: java.io.FileNotFoundException: File does not exist: hdfs://nameservice1/some path.../data

Hive 能够为我提供相同查询的无错误计数。 表是一个外部分区表。

我想忽略丢失的文件并防止我的 Spark 作业失败。 我在互联网上搜索并尝试在创建 spark 会话时设置以下配置参数但没有运气。

    SparkSession.builder
    .config("spark.sql.hive.verifyPartitionPath", "false")
    .config("spark.sql.files.ignoreMissingFiles", true)
    .config("spark.sql.files.ignoreCorruptFiles", true)
    .enableHiveSupport()
    .getOrCreate()

以上配置参数参考https://jaceklaskowski.gitbooks.io/mastering-spark-sql/spark-sql-properties.html

    val sql = "SELECT count(*) FROM db.table WHERE date=20190710"
    val df = spark.sql(sql)
    println(df.count)

我希望 spark 代码在没有 FileNotFoundException 的情况下成功完成,即使分区信息中缺少某些文件。

我想知道为什么spark.sql.files.ignoreMissingFiles 没有效果。

Spark 版本为 2.2.0.cloudera1。 请建议。提前致谢。

【问题讨论】:

【参考方案1】:

设置下面的配置参数解决了这个问题:

对于 Hive:

mapred.input.dir.recursive=true

对于 Spark 会话:

SparkSession.builder
.config("mapred.input.dir.recursive",true)
.enableHiveSupport()
.getOrCreate()

进一步分析,我发现分区目录的一部分在表中注册为分区位置,并且在许多不同的文件夹下,每个文件夹内都有实际的数据文件。 所以我们需要在spark中开启递归发现来读取数据。

【讨论】:

以上是关于在 spark 中跳过 hive 表中丢失的文件以避免 FileNotFoundException的主要内容,如果未能解决你的问题,请参考以下文章

在CSV文件中跳过标题

如何在循环中跳过项目

在SQL加载程序中跳过输入文件中的多列

FOR /F 这是在批处理文件中跳过一行的正确方法

如何跳过 Hive 外部表中的 CSV 标头?

如何在函数调用中跳过可选参数?