Apache spark 星星点点

Apache spark 星星点点,apache-spark,hive,Apache Spark,Hive,我有一个数据集,我想用一个特定的键(clientID)对它进行分区,但有些客户机产生的数据比其他客户机多得多。配置单元中有一个名为“被调用者”的功能,专门用于处理这种情况 但是,我找不到任何迹象表明Spark支持此功能,也找不到如何(如果它确实支持的话)使用它 是否有等效的Spark功能?或者,Spark是否有其他一些功能可以复制这种行为 (作为奖励——也是我实际用例的要求——您的建议方法是否适用于Amazon Athena?据我所知,Spark中没有这种现成的工具。在数据倾斜的情况下,最常见的

我有一个数据集,我想用一个特定的键(clientID)对它进行分区,但有些客户机产生的数据比其他客户机多得多。配置单元中有一个名为“被调用者”的功能,专门用于处理这种情况

但是,我找不到任何迹象表明Spark支持此功能,也找不到如何(如果它确实支持的话)使用它

是否有等效的Spark功能?或者,Spark是否有其他一些功能可以复制这种行为


(作为奖励——也是我实际用例的要求——您的建议方法是否适用于Amazon Athena?

据我所知,Spark中没有这种现成的工具。在数据倾斜的情况下,最常见的是添加一个人工列来进一步压缩数据

假设您希望按列“y”进行分区,但数据非常倾斜,如本玩具示例中所示(1个分区有5行,其他分区只有一行):

val df=spark.range(8)。当('id<5,0')时,带列(“y”)。否则('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(“r”,地板(兰德()*nbOfBuckets))
第二部分展示
+---+---+---+
|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|
+---+---+---+
//还有写作。我们将包含5个元素的分区划分为3个分区。
part_df.write.partitionBy(“y”、“r”).csv(“…”)

你看了吗?那会把数据存储起来(这已经是可行的,Spark有这个功能)。但是,您可以用更复杂的内容替换列值lambda<代码>(列表中的val)?瓦尔:“其他人”也可以。应该在雅典娜也可以,尽管我需要使用,比如说,
clientPartition
,并将
clientID
保留为一个常规列,以假装
功能扭曲。令人印象深刻的解决方案@Oli。rand()的随机性如何?并行执行是否会增加冲突的可能性,即与仅一个节点(coalesce(1))执行相比会有许多相同的值?SparkSQL函数旨在在分布式数据集上调用,并且根据文档,示例是i.i.d.。因此,尽管我不知道实现的细节(所以我可能错了),我会说即使没有
合并,它也可以正常工作(1)
。我的意思是,但对于Spark这样的分布式系统,我们如何保证不同节点的均匀分布?我想我们目前不能保证,因为不同的随机实例无法保证。内置功能可能会以某种方式解决这一问题,但性能仍然是此类功能的阻碍因素党卫军