在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上进行两次传球,所以远非理想。
答案 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)}