我有一个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 |次数。
我想知道我是否走错了路。感谢
答案 0 :(得分:1)
嗯,看起来你好像。您无法在分区迭代器上调用我想知道我是否走错了路。
saveAsTextFile
(不在任何操作或转换中提及),因此整个想法都没有意义。使用外部库从Python代码写入HDFS并非不可能,但我怀疑它值得大家大惊小怪。
相反,您可以使用标准Spark工具处理此问题:
昂贵的方式
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))
便宜的方式。
每个分区都保存为一个名称与分区号对应的单个分区。这意味着您可以使用saveAsTextFile
简单地保存整个RDD,然后重命名单个文件。