【发布时间】:2015-06-05 23:06:02
【问题描述】:
我有一个从 Kafka 流中读取数据并为流中的每个 RDD 执行操作的 spark 作业。如果 RDD 不为空,我想将 RDD 保存到 HDFS,但我想为 RDD 中的每个元素创建一个文件。我找到了
RDD.saveAsTextFile(file_location)
将为每个分区创建一个文件,因此我尝试更改 RDD,使每个分区仅包含一个元素。这是我正在尝试做的一个示例
data = sc.parallelize(['1', '2', '3', '4', '5', '6', '7', '8', '9', '0'])
data.glom().collect() #Produces [['1', '2', '3', '4', '5'], ['6', '7', '8', '9', '0']]
data.saveAsTextFile(file_location) #Produces 2 files
我可以更接近我想要的,但我找不到确保每个分区只有一个元素的方法
data1 = data.coalesce(1, True).repartition(data.count())
data1.glom().collect() #Produces [[], ['1', '2', '3', '4', '5'], ['6', '7', '8', '9', '0'], [], [], [], [], [], [], []]
data2 = data.map(lambda t : t).coalesce(1, True).repartition(data.count())
data2.glom().collect() #Produces [[], ['1'], ['2', '3'], ['4', '5'], ['6'], ['7', '8'], ['9', '0'], [], [], []]
data2.saveAsTextFile(file_location) #Produces 10 files, but some are empty
我知道在这个例子中我可以将我想要的分区传递给 sc.parallelize() 但是当我从 kafka 流中读取时这是不可能的。关于如何以我想要的方式重新分区或如何更好地解决此问题的任何建议?
【问题讨论】:
标签: hadoop apache-spark partitioning rdd pyspark