有没有办法从映射转换内部将RDD行写入HDFS或S3?

时间:2019-04-09 22:12:32

标签: apache-spark

我知道将RDD或数据帧行写入HDFS或S3的典型方法是使用saveAsTextFiledf.write。但是,我想弄清楚如何从像这样的映射转换内部写入单个记录:

myRDD.map(row => {
  if(row.contains("something")) {
    // write record to HDFS or S3
  }
  row
}

我知道可以通过以下代码来完成

val newRDD = myRDD.filter(row => row.contains("something"))
newRDD.saveAsTextFile("myFile")

但是我想在写入HDFS之后继续处理原始的myRDD,这将需要缓存myRDD,并且我的内存资源不足。

1 个答案:

答案 0 :(得分:1)

  

我想在写入HDFS后继续处理原始的myRDD,这将需要缓存myRDD,并且内存资源不足。

以上说法不正确。如果内存不足,则可以进一步在RDD上进行操作而无需进行缓存。

您可以使用Hadoop API在map()函数内部编写代码,但是在map()函数内部操作终端操作不是一个好主意。 map()操作应无副作用。但是,您可以使用mappartition()函数。

您无需缓存RDD即可对其进行后续操作。缓存有助于避免重新计算,但是RDD是不可变的。在每个转换中都会创建一个新的RDD(保留谱系)。