我是hive的新手并尝试转换标准的日期' YYYY-MM-DD'格式,但我希望以YYYYMMDD格式输出。
例如:" 2014-12-25"应该返回20141225.
我正在尝试类似下面给出的内容:
CONCAT(年(start_date),月(start_date),日(start_date))
但这是抛出错误,因为ParseException第2:0行无法识别年附近的输入'('。
有人可以提出一些替代方案吗?
答案 0 :(得分:1)
更新:这被证实是Hive 0.14和新缓存内容的错误。这将通过0.14.1和0.15解决,但目前可以通过关闭缓存来解决:
设置hive.cache.expr.evaluation = false;
我遇到了同样的问题,并在Hive的jira上开了一张票。
我已经在0.14和0.13上测试了concat + date函数,它似乎只是在0.14中引入的一个问题。
答案 1 :(得分:0)
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
一起使用时,我的行为非常奇怪 - 我同意这些应该是正常的您尝试使用它们,但希望{{1}}或{{1}}为您提供可行的解决方法。
答案 2 :(得分:0)
CONCACT
没有错。一个简单的谷歌搜索显示该特定函数需要STRING
,函数day
,month
和year
返回INT
。
只需简单地做
CONCAT(split(start_date, '\\-')[0]
, split(start_date, '\\-')[1]
, split(start_date, '\\-')[2])