Optimization 在配置单元中执行速度非常慢(300万行)的按分区排序的行数(&U)

Optimization 在配置单元中执行速度非常慢(300万行)的按分区排序的行数(&U),optimization,hive,bigdata,row-number,Optimization,Hive,Bigdata,Row Number,我有一个包含50列和300多万条记录的配置单元表。要求根据日期列获取最近的200条记录,因此应用了行数函数。当记录数低于10万条时,它最初运行得非常好,不幸的是,它现在永远运行。有什么特别的优化技术我可以试试吗? 这是一个分区表,这是实现更多细节的方法:按日期分区的行数、规则id、按加载的运行id顺序、日期描述作为规则从表中分区的行数。我猜您分区的列是倾斜的。您应该按该列分组,并计算要确认的行数 如果确实发生了偏差,优化的一般方法是提前一个阶段,并尝试部分聚合和减少数据 根据您的情况,您可以尝试

我有一个包含50列和300多万条记录的配置单元表。要求根据日期列获取最近的200条记录,因此应用了行数函数。当记录数低于10万条时,它最初运行得非常好,不幸的是,它现在永远运行。有什么特别的优化技术我可以试试吗?
这是一个分区表,这是实现更多细节的方法:按日期分区的行数、规则id、按加载的运行id顺序、日期描述作为规则从表中分区的行数。我猜您分区的列是倾斜的。您应该按该列分组,并计算要确认的行数

如果确实发生了偏差,优化的一般方法是提前一个阶段,并尝试部分聚合和减少数据

根据您的情况,您可以尝试以下方法:

假设您的原始SQL如下所示:

select * from (
    select 
        ca,
        cb,
        row_number() over(partition by ca order by cb desc) as rk1
    from my_table 
) tmp
where rk1 <=200;
优化后的版本如下:

with tt1 as(
    select 
        ca,
        cb,
        row_number() over(partition by ca, cast(rand()*20 as int) order by cb desc) as rk1 
    from my_table
)
select * from (
    select 
        ca,
        cb,
        row_number() over(partition by ca order by cb desc) as rk2
    from tt1
    where rk1 <= 200  
) tmp 
where rk2 <= 200;

当列ca发生倾斜时,第二个SQL预期比第一个SQL更快。在第一阶段,castrand*20作为int添加了更多的并行性。在这之后,谓词rk1 Hi和welcome to StackOverflow SO。在这里,我们是一个试图互相帮助的社区。请看一下我如何问一个好的问题StAccOfFuff.com/Help / Hooto to to to更好地设置你的问题,并考虑查看最小的、可重复的示例部分以及StaskOfFult.COM/Help/Mimple AddiiPiLable示例。你能提供一些你到目前为止尝试过的代码吗?这是一个分区表,下面是更多细节的实现:按日期分区的行数,规则id,按加载的运行id顺序,日期描述作为规则行数table@Sudhans您好,请参考上面编辑的答案,看看这是否有帮助:我有一个select语句,其中包含基于上述注释中我的row_num函数细节中PARTITION BY下使用的所有列的过滤器。我真的需要将所有这些列都按分区吗?@Sudhanshu你能提供你的特定SQL吗?从表中选择*其中X_of_date=20191213和rule_row_num