【发布时间】:2018-10-08 09:01:37
【问题描述】:
是否可以使用 Spark API 读取包含具有不同标题的多个部分的 大型 CSV 文件?文件结构如下
BatchCode#1
Name,Surname,Address
AA1,BBB,CCC
AA2,BBB,CCC
AA3,BBB,CCC
BatchCode#2
Name,Surname,Address,Phone
XY1,BBB,CCC,DDD
XY2,BBB,CCC,DDD
XY3,BBB,CCC,DDD
在阅读记录时,我们需要注意标题以及各部分之间的文件格式可能不同。 BatchCode 信息需要从标头中提取,并且应该是该部分中每条记录的一部分 - 例如,第 1 行的数据应解析为:
Name: AAA1
Surname: BBB
Address:CCC
BatchCode:1
我想到了以下选项,但我不完全确定它是否会造成重大问题:
- 使用 wholeTextFile 读取文件。这将使用单个线程读取文件,但会将整个文件加载到内存中,并可能导致大文件出现内存问题。
- 使用 sc.textFile 上的 coalesce(1) 强制 Spark 在单个线程中读取文件。我不确定订单是否始终得到保证。一旦我们将文件作为 RDD 获取,我们将在读取文件时缓存标题行并将它们与相应的数据记录合并。
即使上述方法有效,它们是否有效?什么是最有效的方法?
【问题讨论】:
-
coalesce() 不会帮助读取文件,只会写入文件。
wholeTextFile对你来说真的是个问题吗?你的数据集有多大?我认为您最好的解决方案是将文件预处理为多个文件,每个文件都有自己的 csv 模式(除非这会创建大量小文件,在这种情况下,您最好使用单个流文件解析器) -
看我的回答。我可以分享一些示例代码。
-
wholeTextFiles 对我们不起作用,因为我们将数据设置为 20 GB 作为输入。预处理是一种选择,但我试图弄清楚我们是否可以使用 Spark 内联。我很好奇——我在合并文档中遗漏了什么,它只是说——返回一个新的 RDD,它被缩减为 numPartitions 分区。
-
使用 binaryFiles 选项读取此类文件怎么样?
-
一个新的RDD类似于写。
标签: java scala csv apache-spark