如何将分区保存到特定名称的文件?

时间:2015-11-20 22:48:34

标签: python apache-spark pyspark rdd

我有一个RDD分区,并希望将每个分区保存到具有特定名称的单独文件中。这是我正在使用的重新分配的rdd:

# Repartition to # key partitions and map each row to a partition given their key rank
my_rdd = df.rdd.partitionBy(len(keys), lambda row: int(row[0]))

现在,我想在每个分区上保存AsTextFile()。当然,我应该做像

这样的事情
my_rdd.foreachPartition(lambda iterator_obj: save_all_items_to_text_fxn)

但是,作为测试,我将save_all_items_to_text_fxn()定义如下:

def save_all_items_to_text_fxn(iterator_obj):
     print 'Test'

...而且我注意到它实际上只调用了两次而不是| partitions |次数。

我想知道我是否走错了路。感谢

1 个答案:

答案 0 :(得分:1)

  

我想知道我是否走错了路。

嗯,看起来你好像。您无法在分区迭代器上调用saveAsTextFile(不在任何操作或转换中提及),因此整个想法都没有意义。使用外部库从Python代码写入HDFS并非不可能,但我怀疑它值得大家大惊小怪。

相反,您可以使用标准Spark工具处理此问题:

  1. 昂贵的方式

    def filter_partition(x):
        def filter_partition_(i, iter):
            return iter if i == x else []
        return filter_partition_
    
    for i in rdd.getNumPartitions():
        tmp = dd.mapPartitionsWithIndex(filter_partition(i)).coalesce(1)
        tmp.saveAsTextFile('some_name_{0}'.format(i))
    
  2. 便宜的方式。

    每个分区都保存为一个名称与分区号对应的单个分区。这意味着您可以使用saveAsTextFile简单地保存整个RDD,然后重命名单个文件。