大数据中的一个常见问题是将数据转换为大数据友好格式(parquet 或 TSV)。
在当前返回 RDD[(String, String)]
(path -> whole file as string) 的 Spark wholeTextFiles
中,这是一种有用的方法,但会导致许多问题当文件很大时(主要是内存问题)。
原则上应该可以使用底层 Hadoop API 编写如下方法
def wholeTextFilesIterators(path: String): RDD[(String, Iterator[String])]
其中迭代器是文件(假设换行符作为分隔符)并且迭代器正在封装底层文件读取和缓冲。
在阅读代码一段时间后,我认为解决方案将涉及创建类似于 WholeTextFileInputFormat
和 WholeTextFileRecordReader
的内容。
更新:
经过一些思考,这可能意味着还需要实现一个自定义 org.apache.hadoop.io.BinaryComparable
,这样迭代器就可以在随机播放中幸存下来(很难序列化迭代器,因为它有文件句柄)。
最佳答案
根据 Hyukjin 对 JIRA 的评论,给出了接近想要的东西
spark.format("text").read("...").selectExpr("value", "input_file_name()")
关于hadoop - 如何有效地读取带有 spark 路径的文件,即想要返回 `wholeTextFiles` 的 `RDD[String, Iterator[String]]`,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40739641/