【发布时间】:2020-11-01 23:26:30
【问题描述】:
我想根据 X 列重新分区我的 spark 数据框。假设 X 列有 3 个不同的值(X1、X2、X3)。不同值的数量可能会有所不同。
我希望一个分区包含只有 1 个 X 值的记录。 IE。我想要 3 个分区,其中 1 个的记录是 X=X1 ,另一个是 X=X2 ,最后一个是 X=X3。
我通过查询从数据帧中获得了 X 的独特值
val uniqueList = DF.select("X").distinct().map(x => x(0).toString).collect()
正确地给出唯一值列表。
我正在重新分区
DF = DF.repartition(uniqueList.length, col('X'))
但是,我在 DF 中的分区没有按预期进行。数据分布不正确,一个分区为空,第二个分区包含 X1 的记录,第三个分区包含 X2 和 X3 的记录。
如果我遗漏了什么,有人可以帮忙吗?
编辑:
我的 X 列可能有不同数量的唯一值。它可能有 3 或 3000 个唯一值。 如果我在下面这样做
DF = DF.repartition(col('X'))
我只会得到 200 个分区,因为这是 spark.sql.shuffle.partitions 的默认值。因此我给出了分区数
如果 X 有 3000 个唯一值,那么我想对我的 DF 进行重新分区,使得有 3000 个分区并且每个分区包含 X 的一个特定值的记录。这样我就可以运行 mapPartition 并并行处理每个分区.
【问题讨论】:
-
试试
DF = DF.repartition(col('X')),不提供分区数。
标签: scala apache-spark