我有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)
答案 0 :(得分:0)
结论是,标准功能似乎非常难以实现。
相反,如果输入来自Hadoop文件系统,则可以这样做。这可以通过扩展某些Hadoop类来完成。
首先,您需要实现WritableComparable<>
并定义RDD将包含的自定义格式。要使其生效,您需要定义自定义FileInputFormat
并对其进行扩展,以支持您的自定义Writable
。为了让FileInputFormat
知道如何处理正在读取的数据,必须通过扩展来编写自定义RecordReader
,这里特别需要编写方法nextKeyValue()
来定义每个RDD元素将包含。所有这三个都是用Java编写的,但有一些简单的技巧可以做到。