按列进行火花分区

时间:2018-11-29 12:05:14

标签: scala apache-spark dataframe partitioning

我是Spark的初学者,正在尝试解决歪斜的数据问题。我正在使用来自同事的算法来根据键列分配数据。但是问题是当我重新分区(col(“ keyColumn”))数据帧时,spark合并了几个分区并生成了更大的输出文件。我猜这是因为key.Hashcode()%num_partitions。

数据分发看起来像这样:一个文件最多可以有500,000条记录

| key |count |
+-----+------+
|1    |495941|
|2    |499607|
|3    |498896|
|4    |502845|
|5    |498213|
|6    |501325|
|7    |502355|
|8    |501816|
|9    |498829|
|10   |498272|
|11   |499802|
|12   |501580|
|13   |498779|
|14   |498654|

但是当我在重新分区后查看文件时,该文件包含两个以上的键,这使文件大小增加了一倍。

+----+------+
|key |count |
+----+------+
|101 |500014|
|115 |504995|
+----+------+

我也尝试生成素数随机素数键而不是增量分区键,但是仍然只有几个文件更大并且包含多个键。

当我使用repartition(max_partition_no,col(“ KeyColumn”))时,它会重排数据,并且我得到的文件更大,约为900Mb。预期的文件大小在250-350 MB之间。

我的问题是,如何确保分区有效?另外,如何通过将hashCode重写为重分区函数来传递自定义分区程序?

0 个答案:

没有答案