如何在从文件夹读取到RDD时忽略错误的avro文件

时间:2018-06-14 18:13:04

标签: pyspark

我正在从文件夹中读取一组avro文件,并且程序错误输出并显示错误消息。 //格式化没有正确完成。

df =sqlContext.read.format("com.databricks.spark.avro").load("/data/hadoop20180516/22/abc*.avro").count()
[Stage 2:==================================================>(27818 + 4) / 28318]18/06/14 10:53:44 ERROR Executor: Exception in task 27900.0 in stage 2.0 (TID 27905)

java.io.IOException:不是Avro数据文件

文件夹有30K +文件,其中一个文件可能已损坏。 我想忽略坏文件并继续加载文件的其余部分。

我尝试使用.option命令
.option(“badRecordsPath”,“/ tmp / badRecordsPath”)并没有用。

有什么建议吗?

1 个答案:

答案 0 :(得分:0)

我对python的了解不足,无法为您提供良好的代码示例,但是我在Scala中解决了这个问题,因此您可以尝试:

使用

读取文件夹内的所有文件
val paths = sparkContext.wholeTextFiles(folderPath).collect { case x: (String, String) => x._1 }.collect()

在这里,我使用部分函数仅获取键(文件路径),然后再次收集以遍历字符串数组,而不是字符串的RDD

将每个文件作为DataFrame加载,并跳过失败的文件

val filteredDFs = files.map { path =>
      Try(sparkSession
        .read
        .format(format)
        .options(options)
        .load(path)).toOption}.filter(_.isDefined).map(_.get)

最后使用union创建一个包含所有先前DF的DataFrame

val finalDF = filteredDfs.reduce((df1, df2) => df1.union(df2))