将RDD [(Array [String],Long)]中的内容添加到新数组中为新RDD:RDD [Array [(Array [String],Long)]]

时间:2017-12-08 10:07:28

标签: scala apache-spark rdd

我有RDD[Array[String]]我的zipWithIndex:

val dataWithIndex = data.zipWithIndex()

现在我有一个RDD[(Array[String], Long)],我想将RDD中的所有对添加到一个数组中,并且仍然在RDD中。有没有一种有效的方法呢?我的最终数据结构应该是RDD[Array[(Array[String], Long)]],其中RDD基本上只包含一个元素。

现在我执行以下操作,但由于collect()

,它效果非常差
val dataWithIndex = data.zipWithIndex()
val dataNoRDD = dataWithIndex.collect()
val dataArr = ListBuffer[Array[(Array[String], Long)]]()
dataArr += dataNoRDD
val initData = sc.parallelize(dataArr)

1 个答案:

答案 0 :(得分:0)

结论是,标准功能似乎非常难以实现。

相反,如果输入来自Hadoop文件系统,则可以这样做。这可以通过扩展某些Hadoop类来完成。

首先,您需要实现WritableComparable<>并定义RDD将包含的自定义格式。要使其生效,您需要定义自定义FileInputFormat并对其进行扩展,以支持您的自定义Writable。为了让FileInputFormat知道如何处理正在读取的数据,必须通过扩展来编写自定义RecordReader,这里特别需要编写方法nextKeyValue()来定义每个RDD元素将包含。所有这三个都是用Java编写的,但有一些简单的技巧可以做到。