2017-02-15 19 views
1

我想用火花来处理一个文件,但是我的输入文件有一条信息遍布3行的单个“记录”。spark阅读slipline的多行记录

Rec1 Line1 
Rec1 Line2 
Rec1 Line3 
Rec2 Line1 
Rec2 Line2 
Rec2 Line3 

没有钥匙链接记录的行,唯一的连接是他们是三行相邻。除了知道第四行是新记录的开始之外,没有记录分隔符。我看到的所有其他问题都与多行记录有关,似乎有一些明显的记录分隔符,而在这种情况下我没有任何记录,我不得不依赖行数。

我首先想到的是使用sliding函数从org.apache.spark.mllib.rdd.RDDFunctions

sc.textFile("myFile.txt").sliding(3,3) 

这接通我的RDD [字符串]进入和RDD [阵列[字符串]]其中在RDD每个元素是从文件3行。

在一些测试中,这看起来像它的工作是得到我想要的结果,但我注意到sliding函数在其评估过程中实际上导致collect。这让我担心,它在收集什么?它是整个数据文件还是其他的东西?我的文件太大而无法将全部内容收集到驱动程序中。

sliding是读取此文件的最佳方式,还是有更高效的方法来执行此操作?

+0

不能使用rdd.map(_。split(“”))。map(arr =>(arr [0],arr [1]))。groupBy(_._ 2)?这意味着按照空格分隔你的线条,制作一个键,值和按键分组。 – dumitru

+0

@dumitru groupBy文件没有密钥。我也许可以使用'zipWithIndex'来获得用于分组的密钥。这也会导致全面洗牌。 – puhlen

回答

1

您看到的collect()调用不会收集所有RDD数据,而是收集分区摘要信息。调用.sliding将使您的文本文件被读取额外的时间来计算此信息,但不会导致您吹出驱动程序内存。

我通过阅读Spark 2.0.2中的代码org.apache.spark.mllib.rdd.SlidingRDD了解了这一点。

为了您的目的,.sliding似乎是最好的选择。