【发布时间】:2018-01-08 07:01:14
【问题描述】:
我有一个架构如下的数据框:
root
|-- category_id: string (nullable = true)
|-- article_title: string (nullable = true)
看起来像这样的数据:
+-----------+--------------------+
|category_id| articletitle |
+-----------+--------------------+
| 1000|HP EliteOne 800 G...|
| 1000|ASUS EB1501P ATM...|
| 1000|HP EliteOne 800 G...|
| 1|ASUS R557LA-XO119...|
| 1|HP EliteOne 800 G...|
+-----------+--------------------+
只有两个不同的category_id 1000 和 1。
我想通过category_id 和mapPartition 对每个分区进行重新分区。
p_df = df.repartition(2, "category_id")
p_df.rdd.mapPartitionsWithIndex(some_func)
但是数据没有得到正确的分区,预期的结果是每个 mappartition 将只有一个category_id 的数据。但实际结果是一个分区得到0条记录,而另一个分区得到所有记录。
为什么会发生这种情况以及如何解决这个问题?
已经有一个question 介绍了 spark 分区器的工作原理。我的问题不同,因为答案仅包含对分区器如何工作的解释,但我的问题是关于为什么会发生这种情况(已经回答)以及如何解决它。
【问题讨论】:
-
您是如何得出一个分区为空而另一个分区有所有记录的结论的?可以添加
p_df.withColumn("partition" , spark_partition_id()).show()的输出吗? -
没关系。它为 Spark 1.6 提供了准确的分区,但为 Spark 2.2 中的所有记录提供了相同的分区 ID。
标签: apache-spark pyspark