Hive窗口函数ROW_NUMBER没有分区BY子句是非常慢的。有没有更好的优化方法?

问题描述 投票:1回答:3

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

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

row_number()结束(由event_id,user_id,时间戳按id排序)>

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

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

row_number()over()as id

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

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

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

我有一个具有5000万条记录的HDFS文件,原始文件大小为50 GB。我正在尝试将其加载到配置单元表中,并在加载时使用以下内容为所有行创建唯一的ID。我正在使用Hive 1.1 ....

hadoop hive mapreduce query-optimization window-functions
3个回答
1
投票

您可以使用UUID:


0
投票

代替尝试sort bycluster by的顺序


0
投票

@leftjoin's在此用例中,建议就像一个咒语一样(非常感谢!)。它不涉及“减少”步骤,并且作业在不到3分钟的时间内完成。经过测试,它确实产生了唯一的ID。将检查基础代码,因为它非常吸引人,即使使用500多个映射器,它也能够产生唯一的ID。

© www.soinside.com 2019 - 2024. All rights reserved.