在 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的主要内容,如果未能解决你的问题,请参考以下文章