2016-01-20 28 views
0

在spark 1.5+中,如何将“n”-tuple RDD的每列写入不同位置?垂直分区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两次。你可以,你可以去这样做

+0

如果你工作只用'Tuple2'就可以使用'pairRDD.keys'和'pairRDD.values' –

回答

0

的一种方法是通过将元组到列表中,然后使用地图创建RDDS列表,并执行保存每个如下:

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)}