首页 > 解决方案 > 按表达式或模板进行 Hive 分区

问题描述

我找到了这样的 hive-ql 脚本:

ALTER TABLE dwd.o_p_data_reports
DROP IF EXISTS PARTITION (partition_dt='${#date(0,0,-1):yyyyMMdd#}');

insert overwrite table dwd.o_p_data_reports partition (partition_dt = '${#date(0,0,-1):yyyyMMdd#}')
-- no changed
select 
 dwd.id
,dwd.title
,dwd.desc
,dwd.source
,dwd.source_url
,dwd.download_url
,dwd.cloud_url
,dwd.publish_date
,dwd.created_at
,dwd.updated_at
,dwd.last_fetched_at
,dwd.size
,dwd.cate
,dwd.author
,dwd.site
,dwd.page_num
,dwd.sectors
from 
(select * from dwd.o_p_data_reports where partition_dt = '${#date(0,0,-2):yyyyMMdd#}') dwd 
left join 
(select * from ods.o_p_data_reports where partition_dt = '${#date(0,0,-1):yyyyMMdd#}') ods  
on dwd.id = ods.id  
where ods.id is null 

还有一些不寻常的东西,看起来像是一个表达式,它会在执行整个查询脚本之前'${#date(0,0,-1):yyyyMMdd#}'产生一些特定的值。

该脚本在服务器上运行良好,partition_dt类似于20200115. 但是,它会在我自己的计算机上直接在 hive shell 中执行失败,因为partition_dt只会$在这种情况下产生。

据我所知,partition_dt = '${#date(0,0,-1):yyyyMMdd#}'是:

  1. 不是 hive 函数调用,因为
  2. 不是 hive 变量,因为第一行没有设置变量,并且格式错误(即${foobar}, not ${#foobar#}
  3. 不是 UDF,因为没有 UDF 导入
  4. 不是动态分区,因为它会因date_add()服务器上的动态分区(使用 hive datetime 函数等)而失败,但这个分区会成功。

那么是什么'${#date(0,0,-1):yyyyMMdd#}'

标签: javatemplateshadoophiveexpression

解决方案


推荐阅读