HIVE CTE

HIVE CTE

CTE(Common Table Expression)

公共表表达式 (CTE) 是从 WITH 子句中指定的简单查询派生的临时结果集,它紧跟在 SELECT 或 INSERT 关键字之前。CTE 仅在单个语句的执行范围内定义。在 Hive SELECT、INSERT、 CREATE TABLE AS SELECT或CREATE VIEW AS SELECT语句中可以使用一个或多个 CTE 。

作用:

相当于视图,定义了一个SQL片段,每次使用时候可以将该定义的SQL片段拿出来再被使用,该SQL片段可以理解为一个变量,主要用途简化SQL,让SQL更简洁,替换子查询,方便定位问题。

语法:

with temp_name as (select statement)

规则:

1.子查询块中不支持 WITH 子句;
2.视图、CTAS(Create Table As Select)和 INSERT 语句支持 CTE;
3.不支持递归查询。

优化:

默认情况下,如果使用CTE后被多次使用,则CTE子句就会被执行多次,若需要用HIVE CTE进行优化,则需要通过参数调优,如下:

hive.optimize.cte.materialize.threshold

hive物化调参
该参数默认值为:-1,表示不开启物化,当开启(大于等于0),比如设置为2,表示如果with…as语句被引用2次及以上时,会把with…as语句生成的table物化,从而做到with…as语句只执行一次,来提高效率。
在默认情况下,可以通过explain来查看执行计划:

验证:

with temp as (select rand())

select * from temp 
union all 
select * from temp

运行结果:
默认情况下使用CTE测试结果
从结果来看,产生的随机数不一样,说明CTE被执行了两次。

再将默认值改为1:

set hive.optimize.cte.materialize.threshold = 1 ;

查看运行结果:
调参后的CTE使用测试结果
从结果上看,产生的随机数一样,说明temp被物化了。物化类似于计算的中间结果进行缓存或落到磁盘,这样每次计算的时候可以从该中间结果中取数,这样才可以达到一次分析,多次使用的目的。

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 7
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值