垂直分区RDD并写入不同的位置

时间:2016-01-20 01:15:48

标签: apache-spark rdd

在spark 1.5+中,如何将" n" -tuple RDD的每一列写入不同的位置?

例如,如果我有RDD[(String, String)],我希望将第一列写入s3://bucket/first-col,将第二列写入s3://bucket/second-col

我可以做以下

 val pairRDD: RDD[(String, String)]
 val cachedRDD = pairRDD.cache()
 cachedRDD.map(_._1).saveAsTextFile("s3://bucket/first-col")
 cachedRDD.map(_._2).saveAsTextFile("s3://bucket/second-col")

但由于我需要在RDD上进行两次传球,所以远非理想。

1 个答案:

答案 0 :(得分:0)

你能做到这一点的一种方法是将元组转换为列表,然后使用map创建RDD列表并按如下方式对每个RDD执行保存:

val fileNames:List[String] 
val input:RDD[(String, String...)] //could be a tuple of any size
val columnIDs = (1 to numCols)
val unzippedValues = input.map(_.productIterator.toList).persist() //converts tuple into list
val columnRDDs = columnIDs.map( a => unzippedValues.map(_(a)))
columnRDDs.zip(fileNames)foreach{case(b,fName) => b.saveAsTextFile(fName)}