Apache spark 星星点点
我有一个数据集,我想用一个特定的键(clientID)对它进行分区,但有些客户机产生的数据比其他客户机多得多。配置单元中有一个名为“被调用者”的功能,专门用于处理这种情况 但是,我找不到任何迹象表明Spark支持此功能,也找不到如何(如果它确实支持的话)使用它 是否有等效的Spark功能?或者,Spark是否有其他一些功能可以复制这种行为Apache spark 星星点点,apache-spark,hive,Apache Spark,Hive,我有一个数据集,我想用一个特定的键(clientID)对它进行分区,但有些客户机产生的数据比其他客户机多得多。配置单元中有一个名为“被调用者”的功能,专门用于处理这种情况 但是,我找不到任何迹象表明Spark支持此功能,也找不到如何(如果它确实支持的话)使用它 是否有等效的Spark功能?或者,Spark是否有其他一些功能可以复制这种行为 (作为奖励——也是我实际用例的要求——您的建议方法是否适用于Amazon Athena?据我所知,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这样的分布式系统,我们如何保证不同节点的均匀分布?我想我们目前不能保证,因为不同的随机实例无法保证。内置功能可能会以某种方式解决这一问题,但性能仍然是此类功能的阻碍因素党卫军