如何在读取镶木地板文件时检查损坏的文件?
Posted
技术标签:
【中文标题】如何在读取镶木地板文件时检查损坏的文件?【英文标题】:how to check the corrupted file while reading the parquet files? 【发布时间】:2019-05-16 07:07:59 【问题描述】:我在从我的程序定期生成的 hdfs 中读取镶木地板时遇到了一些问题。因此,如果程序由于某种原因出现故障,它可能会产生一些损坏的文件。
现在,我想要将损坏的文件与正常文件区分开来并移至备份目录。但是我找不到一个好的方法。
我遇到过两种损坏的文件:
1.parquet is not a Parquet file (too small length: 4)
在这种情况下,由于它的大小很容易分辨
2.parquet is not a Parquet file. expected magic number at tail [80, 65, 82, 49] but found [56, 52, 53, 51]
在这种情况下,在阅读之前,我不知道要从普通人那里分辨出来。
我已经阅读了这个网站: https://datameer.zendesk.com/hc/en-us/articles/360006392072-Workbook-Fails-path-to-file-Is-Not-a-Parquet-File-Expected-Magic-Number-at-Tail
根据它,“这将低于其他文件。>,但我还找不到它。
有什么好的解决办法吗?谢谢。
【问题讨论】:
【参考方案1】:我找到了检查损坏文件的方法。我将函数 readFooter() 从 ParquetFileReader.java 复制到我的项目中,并使用迭代器来获取所有 parquet 文件并将 readFooter() 应用于它们。最后将这些损坏的保存到一个数组中并将其移动到另一个目录。
【讨论】:
【参考方案2】:这两个错误都表明 parquet 文件在写入期间未正确关闭。我建议在阅读时不检查是否损坏,而是将写入逻辑修改如下:
-
在读者看不到的临时目录中创建新的 parquet 文件
写入您要写入的数据并关闭文件
将文件移动到正确的位置,以便读者可以找到它
因此,阅读器只会观察到正确关闭的文件。损坏的文件将保留在临时目录中。
【讨论】:
我觉得你的还不错。但我对此有一些疑问。在我的例子中,我使用 spark-structured-streaming 来使用来自 kafka 的数据,并通过 writeStream 每 10 分钟的批次保存它。我不知道如何完成现在通过 spark-structured-streaming 自动完成的第二部分?以上是关于如何在读取镶木地板文件时检查损坏的文件?的主要内容,如果未能解决你的问题,请参考以下文章
我对镶木地板文件和 python 完全陌生,谁能告诉我如何在 pyspark 中读取带有标题的镶木地板文件