Я нашел скрипт 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
. Однако на моем собственном компьютере произойдет сбой при непосредственном выполнении в оболочке куста, поскольку partition_dt
в этом случае выдаст только $
.
Из того, что я знаю, partition_dt = '${#date(0,0,-1):yyyyMMdd#}'
:
- не вызов функции hive, поскольку
- не переменная hive, поскольку в первой строке не заданы переменные, а формат неправильный (то есть
${foobar}
, а не ${#foobar#}
) - не UDF, поскольку нет импорта UDF
- , а не раздел Dynami c, потому что это приведет к сбою с разделом Dynami c (с использованием функции даты и времени Hive, такой как
date_add()
) на сервер, но успех с этим.
Так что же такое '${#date(0,0,-1):yyyyMMdd#}'
?