通过在配置单元中执行非常慢(300万行)来按顺序划分的行数(&O)

nhhxz33t  于 2021-06-25  发布在  Hive
关注(0)|答案(1)|浏览(378)

我有一个配置单元表,有50列和300多万条记录。要求根据日期列获取最新的200条记录,因此应用了行数函数。最初,当记录数低于10万条时,它运行得非常好,不幸的是,它现在永远运行。有什么特别的优化技术我可以试试吗?它是一个分区表,下面是详细信息的实现:row\u number()over(partition by date,rule\u id,run\u id order by load\u date desc)as rule\u row\u num from table

3yhwsihp

3yhwsihp1#

我猜你划分的列是倾斜的。你应该 group by 并计算要确认的行数。
如果确实发生了偏差,一般的优化方法是提前一个阶段,并尝试部分地聚合和减少数据。
根据您的情况,您可以尝试以下方法:
假设您的原始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快。在第一阶段,通过 cast(rand()*20 as int) . 在那之后, predicate where rk1 <= 200 执行,大大减少了以后要处理的数据。

相关问题