在PySpark中将RDD写入多个文件

7
我有一个包含键值对的RDD。只有三个键,我想将给定键的所有元素写入文本文件。目前我需要进行三次操作,但我想看看是否可以一次完成。
以下是我目前的代码:
# I have an rdd (called my_rdd) such that a record is a key value pair, e.g.: 
# ('data_set_1','value1,value2,value3,...,value100')

my_rdd.cache()
my_keys = ['data_set_1','data_set_2','data_set_3']
for key in my_keys:
    my_rdd.filter(lambda l: l[0] == key).map(lambda l: l[1]).saveAsTextFile(my_path+'/'+key)

这样做可以实现,但是缓存并三次遍历可能会耗费很长时间。我想知道是否有一种同时写入所有三个文件的方法?


这里有一个问题:https://issues.apache.org/jira/browse/SPARK-3533。解决方法在这里发布:https://dev59.com/ZWAg5IYBdhLWcg3wFHqF - Def_Os
@mglodwasser -- 这是一个很好的RDD案例研究,不过使用partitionBy dataframe writer类也可以轻松完成。干杯 - vikrant rana
1个回答

2

使用自定义分区器的替代方法(在写入输出文件之前对数据集进行分区,与Def_Os提供的方法相比)

例如:
RDD[(K, W)].partitionBy(partitioner: Partitioner)

class CustmozedPartitioner extends Partitioner {

  override def numPartitions: Int = 4

  override def getPartition(key: Any): Int = {
    key match {
      case "data_set_1" => 0
      case "data_set_2" => 1
      case "data_set_3" => 2
      case _ => 3
    } 
  }
}

1
这个能用Python写吗? - mgoldwasser

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接