gpt4 book ai didi

hadoop - 在大型(50 GB)数据集上,没有“分区BY子句”的Hive窗口函数ROW_NUMBER非常慢。有更好的优化方法吗?

转载 作者:行者123 更新时间:2023-12-02 18:44:05 25 4
gpt4 key购买 nike

我有一个具有5000万记录的HDFS文件,原始文件大小为50 GB。

我正在尝试将其加载到配置单元表中,并在加载时使用以下内容为所有行创建唯一的ID。我正在使用Hive 1.1.0-cdh5.16.1。

row_number()over(按event_id,user_id,timestamp排序)作为ID

执行时,我看到在化简步骤中分配了40个化简器。 39个Reducer的平均时间约为2分钟,而最后一个Reducer大约需要25分钟,这显然使我相信,大多数数据是在一个Reducer中处理的。

我怀疑Order By子句是造成这种现象的原因,并尝试了以下方法,

row_number()over()作为ID

但是,我看到了相同的行为。

考虑到Map Reduce范式,我觉得如果不指定Partition BY子句,则必须在一个reducer(未分配)中处理数据,以便查看所有行并附加正确的行号。对于在倾斜列上没有分区By子句或partition By的任何Window函数,这可能都是正确的。

现在,我的问题是,当我们不得不避免使用Partition BY子句时,如何解决这个问题并优化窗口函数?

最佳答案

您可以使用UUID:

select java_method('java.util.UUID','randomUUID')

在系统/工作流程中生成的UUID在其他系统中也将是唯一的,因为UUID是全局唯一的。 UUID可以完全分布式且快速地工作。

同样在Hive 3.x中,您可以在DDL中使用 SURROGATE_KEY函数

关于hadoop - 在大型(50 GB)数据集上,没有“分区BY子句”的Hive窗口函数ROW_NUMBER非常慢。有更好的优化方法吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58624633/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com