我正在尝试处理带有spark的文件,但我的输入文件只有3行信息的“记录”。
Rec1 Line1
Rec1 Line2
Rec1 Line3
Rec2 Line1
Rec2 Line2
Rec2 Line3
没有键连接记录的行,唯一的连接是它们是彼此相邻的三行。知道第4行是新记录的开头之后,没有记录分隔符。我看到的与多行记录相关的所有其他问题似乎都有某种明显的记录分隔符,而在这种情况下我没有,我必须依赖行数。
我的第一个想法是使用sliding
org.apache.spark.mllib.rdd.RDDFunctions
函数
sc.textFile("myFile.txt").sliding(3,3)
这将我的RDD [String]转换为RDD [Array [String]],其中RDD中的每个元素都是文件的3行。
在某些测试中看起来它的工作原理是获得我想要的结果,但是我注意到sliding
函数在评估过程中实际上会导致collect
。这让我很担心,它收集的是什么?它是整个数据文件还是其他什么?我的文件太大,无法将整个内容收集到驱动程序中。
sliding
是读取此文件的最佳方式,还是有更有效的方法来执行此操作?
答案 0 :(得分:1)
您看到的collect()
电话不会收集所有RDD数据,而是收集分区摘要信息。调用.sliding
将导致您的文本文件被额外的时间读取以计算此信息,但它不会导致您的驱动程序内存耗尽。
我通过阅读Spark 2.0.2中的org.apache.spark.mllib.rdd.SlidingRDD
中的代码了解到了这一点。
出于您的目的,.sliding
似乎是最好的选择。