Spark RDD take()与Sequence File

时间:2015-11-11 21:50:39

标签: hadoop apache-spark sequencefile

看起来RDD.take()只是在由SequenceFile支持时重复读取的最后一个元素 例如:

val rdd = sc.sequenceFile("records.seq", classOf[LongWritable], classOf[RecordWritable])
val records: Array[(LongWritable, RecordWritable)] = rdd.take(5)
System.out.println(records.map(_._2.toString).mkString("\n"))

输出:

Record(3.1, 2.5)
Record(3.1, 2.5)
Record(3.1, 2.5)
Record(3.1, 2.5)
Record(3.1, 2.5)

即使我知道行是唯一的。

此问题也适用于sc.binaryRecords()

我意识到这可能与Hadoop Writable缓存问题有关,但有没有计划解决这个问题?有没有解决方法?

1 个答案:

答案 0 :(得分:1)

我尝试复制你的问题,是的,当我直接在 sc.sequenceFile()的结果上调用时,我也看到了类似的行为。但能够找到解决方法:

注意:我正在解释使用LongWritable和Text而不是RecordWritable。我不确定RecordWritable 所需的导入
我的序列文件有:(0,0) (1,1) (2,2) ...

val rdd = sc.sequenceFile("sequencefile.seq", classOf[LongWritable], classOf[Text])
val map = rdd.map(case (k,v) => (k.get(),v.toString()))
map.take(1);
res5: Array[(Long, String)] = Array((0,0))
map.take(5);
res4: Array[(Long, String)] = Array((0,0), (1,1), (2,2), (3,3), (4,4))