CONCAT 似乎有一些我无法完全诊断的奇怪行为,但您可以使用正则表达式作为替代方案。我用您在问题中给出的示例日期加载了一个名为 test 的测试表:
hive> describe test;
OK
start_date date
Time taken: 0.719 seconds, Fetched: 1 row(s)
hive> select * from test;
OK
2014-12-25
Time taken: 0.206 seconds, Fetched: 1 row(s)
两种可能的方法(对于以下选项,我正在使用 Hive 0.14 在 HDP 2.2 上进行测试):
如果您对数据的格式化方式有信心,请使用regexp_replace。
hive> select regexp_replace(start_date, '-', '') from test;
OK
20141225
Time taken: 0.289 seconds, Fetched: 1 row(s)
或者,如果您的数据格式更加动态,或者您预计它以后可能会发生变化,那么使用regexp_extract 可能会为您提供更大的灵活性,以防发生变化。该脚本似乎产生了您正在寻找的结果:
SET REGEX="(\\d{4})-(\\d{2})-(\\d{2})";
SELECT
CONCAT(
regexp_extract(start_date, ${hiveconf:REGEX}, 1),
regexp_extract(start_date, ${hiveconf:REGEX}, 2),
regexp_extract(start_date, ${hiveconf:REGEX}, 3)
)
FROM test;
当我尝试将 CONCAT 与 YEAR/MONTH/DAY 提取函数一起使用时,我遇到了非常奇怪的行为 - 我同意这些应该按照您尝试使用它们的方式工作,但希望 regexp_replace 或 regexp_extract 能给你一个可行的解决方法。