在配置单元中将日期转换为十进制格式

时间:2015-01-02 10:44:14

标签: date hive

我是hive的新手并尝试转换标准的日期' YYYY-MM-DD'格式,但我希望以YYYYMMDD格式输出。

例如:" 2014-12-25"应该返回20141225.

我正在尝试类似下面给出的内容:

CONCAT(年(start_date),月(start_date),日(start_date))

但这是抛出错误,因为ParseException第2:0行无法识别年附近的输入'('。

有人可以提出一些替代方案吗?

3 个答案:

答案 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中引入的一个问题。

https://issues.apache.org/jira/browse/HIVE-9459

答案 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,函数daymonthyear返回INT。   只需简单地做

CONCAT(split(start_date, '\\-')[0]
     , split(start_date, '\\-')[1]
     , split(start_date, '\\-')[2])