java - 按表达式或模板进行 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#}'
是:
- 不是 hive 函数调用,因为
- 不是 hive 变量,因为第一行没有设置变量,并且格式错误(即
${foobar}
, not${#foobar#}
) - 不是 UDF,因为没有 UDF 导入
- 不是动态分区,因为它会因
date_add()
服务器上的动态分区(使用 hive datetime 函数等)而失败,但这个分区会成功。
那么是什么'${#date(0,0,-1):yyyyMMdd#}'
?
解决方案
推荐阅读
- c - 打印到 stderr 未达到 stderr
- mysql - 将列表从 S3 传递到 Athena 查询
- next.js - 有没有办法让 Formik 使用 NextJS 在 Internet Explorer 11 中工作
- python - C# 是否有与 Python 的 random.choices() 等价的东西
- sql - 如何在 RLIKE Hive 中转义单引号?双单引号不起作用
- python - 如何将 RasPi Python 代码转换为 JetsonNano 兼容的 Python 代码
- javascript - 我如何使用我从表单中输入的数字作为chartjs的输入数据
- regex - /bin/expect $expect_out 多个正则表达式匹配
- python - tensorflow.python.framework.errors_impl.InvalidArgumentError:从形状为 [1,1] 的张量中指定形状为 [60,1] 的列表
- python - 如何将我的数据从文件输入到字典中?