Apache spark 对RDD进行垂直分区并写入不同的位置
在spark 1.5+中,如何将“n”元组RDD的每一列写入不同的位置 例如,如果我有一个Apache spark 对RDD进行垂直分区并写入不同的位置,apache-spark,rdd,Apache Spark,Rdd,在spark 1.5+中,如何将“n”元组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
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进行两次遍历。一种方法是将元组转换为列表,然后使用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)}
如果只使用
Tuple2
,则可以使用pairdd.keys
和pairdd.values