我有一个数据集,我想按特定键(clientID)进行分区,但某些客户端产生的数据比其他客户端多得多。 Hive 中有一个功能称为“列表分桶“由”调用倾斜于”专门针对这种情况。
但是,我找不到任何迹象表明 Spark 支持此功能,或者如何(如果支持的话)使用它。
Spark 是否有等效的功能?或者,Spark 是否有其他一些功能可以复制此行为?
(作为奖励 - 以及我的实际用例的要求 - 您建议的方法是否适用于 Amazon Athena?)
据我所知,Spark中没有这样的开箱即用的工具。如果数据存在偏差,最常见的是添加人工列来进一步对数据进行分桶。
假设您想按列“y”进行分区,但数据非常倾斜,就像这个玩具示例一样(1 个分区有 5 行,其他分区只有一行):
val df = spark.range(8).withColumn("y", when('id < 5, 0).otherwise('id))
df.show()
+---+---+
| id| y|
+---+---+
| 0| 0|
| 1| 0|
| 2| 0|
| 3| 0|
| 4| 0|
| 5| 5|
| 6| 6|
| 7| 7|
+-------+
现在让我们添加一个人工随机列并写入数据框。
val maxNbOfBuckets = 3
val part_df = df.withColumn("r", floor(rand() * nbOfBuckets))
part_df.show
+---+---+---+
| id| y| r|
+---+---+---+
| 0| 0| 2|
| 1| 0| 2|
| 2| 0| 0|
| 3| 0| 0|
| 4| 0| 1|
| 5| 5| 2|
| 6| 6| 2|
| 7| 7| 1|
+---+---+---+
// and writing. We divided the partition with 5 elements into 3 partitions.
part_df.write.partitionBy("y", "r").csv("...")
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)