我正在从文件夹中读取一组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”)并没有用。
有什么建议吗?
答案 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))