我是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重写为重分区函数来传递自定义分区程序?