我有一个RDD
,大到collect
。我已经向RDD
应用了一系列转换,并希望将其转换后的数据直接从我的从属分区发送到S3。我目前的运作情况如下:
val rdd:RDD = initializeRDD
val rdd2 = rdd.transform
rdd2.first // in order to force calculation of RDD
rdd2.foreachPartition sendDataToS3
不幸的是,发送到S3的数据未转换。 RDD
看起来与第initializeRDD
阶段完全一样。
这是sendDataToS3的主体:
implicit class WriteableRDD[T](rdd:RDD[T]){
def transform:RDD[String] = rdd map {_.toString}
....
def sendPartitionsToS3(prefix:String) = {
rdd.foreachPartition { p =>
val filename = prefix+new scala.util.Random().nextInt(1000000)
val pw = new PrintWriter(new File(filename))
p foreach pw.println
pw.close
s3.putObject(S3_BUCKET, filename, new File(filename))
}
this
}
}
使用rdd.transform.sendPartitionsToS3(prefix)
调用此方法。
如何确保sendDataToS3
中发送的数据是转换后的数据?
答案 0 :(得分:3)
我的猜测是您的代码中存在一个未包含在问题中的错误。
我正在回答只是为了确保你知道RDD.saveAsTextFile
。您可以在S3(s3n://bucket/directory
)上给它一个路径,它会直接从执行程序将每个分区写入该路径。
我很难想象你何时需要实现自己的sendPartitionsToS3
而不是saveAsTextFile
。