Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/apache-spark/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/url/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Apache spark 如何将转换后的数据从分区发送到S3?_Apache Spark - Fatal编程技术网

Apache spark 如何将转换后的数据从分区发送到S3?

Apache spark 如何将转换后的数据从分区发送到S3?,apache-spark,Apache Spark,我有一个RDD,它对收集来说太大了。我已经对RDD应用了一系列转换,并希望将转换后的数据直接从从属服务器上的分区发送到S3。我目前的经营情况如下: val rdd:RDD = initializeRDD val rdd2 = rdd.transform rdd2.first // in order to force calculation of RDD rdd2.foreachPartition sendDataToS3 不幸的是,发送到S3的数据未经转换。RDD看起来与stageinitia

我有一个
RDD
,它对
收集
来说太大了。我已经对
RDD
应用了一系列转换,并希望将转换后的数据直接从从属服务器上的分区发送到S3。我目前的经营情况如下:

val rdd:RDD = initializeRDD
val rdd2 = rdd.transform
rdd2.first // in order to force calculation of RDD
rdd2.foreachPartition sendDataToS3
不幸的是,发送到S3的数据未经转换。
RDD
看起来与stage
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(前缀)
调用的


我如何确保在
sendDataToS3
中发送的数据是转换后的数据?

我猜您的代码中有一个bug没有包含在问题中

无论如何,我回答这个问题只是为了确保您知道
RDD.saveAsTextFile
。您可以在S3上给它一个路径(
s3n://bucket/directory
),它将直接从执行器将每个分区写入该路径


我很难想象您何时需要实现自己的
sendPartitionsToS3
而不是使用
saveAsTextFile

我无法用您提供的代码重现问题。您是否能够从
foreachPartition
闭包保存转换后的数据,可能会将其传递给S3?我还没有尝试S3,但转换后的数据会正确地传递给函数,并从函数中传递。当我收集RDD时,数据会被转换。当我从
foreachPartition
块将它发送到S3时,它不是。我放弃了。我认为一般情况下不可能重现这种情况,所以要么是代码中出现了一些奇怪的问题,要么是遇到了一个非常奇怪的bug。