如何将TIMESTAMPS格式转换为与Impala兼容

时间:2015-04-29 04:39:57

标签: sql regex impala

以下是CSV格式的数据示例:

6/30/2014 23:57,2006,604,131
7/1/2014 0:24,2217,263,143
6/30/2014 23:26,173,3481,134
...

我想在Impala表中加载此CSV文件,并将第一列设为" TIMESTAMP":

CREATE TABLE my_table(col1 timestamp, col2 int, col3 int, col4 int)
  row format delimited
  fields terminated by ',';

LOAD DATA INPATH '/dataset/data' INTO TABLE my_table;

但Impala接受TIMESTAMPS作为以下格式:

YYYY-MM-DD HH:MM:SS.sssssssss

我的数据是:

MM/DD/YYYY HH:MM 

如何以最快的方式将我的数据转换为Impala可读作为TIMESTAMPS?我正在尝试使用regexp_replace,但是制作一个好的正则表达式并不是很成功。

2 个答案:

答案 0 :(得分:3)

from_unixtime(unix_timestamp(timestamp,' input_format'))解决方案将与Hive一起使用,但无论出于何种原因,它都不适用于Impala。我认为这是一个错误,建议你把它提交给Cloudera。

答案 1 :(得分:0)

  

我正在尝试使用regexp_replace但是不太成功   一个很好的正则表达

正则表达式如何从丑陋的日期格式中提取单个字段,然后用旧的 printf 来重建一致的格式呢?

select printf('%04d-%02d-%02d %02d:%02d:%02d.%06d'
             , cast(regexp_extract('7/1/2014 0:24', '[0-9]+/[0-9]+/([0-9]+) [0-9]+:[0-9]+', 1) as int)
             , cast(regexp_extract('7/1/2014 0:24', '([0-9]+)/[0-9]+/[0-9]+ [0-9]+:[0-9]+', 1) as int)
             , cast(regexp_extract('7/1/2014 0:24', '[0-9]+/([0-9]+)/[0-9]+ [0-9]+:[0-9]+', 1) as int)
             , cast(regexp_extract('7/1/2014 0:24', '[0-9]+/[0-9]+/[0-9]+ ([0-9]+):[0-9]+', 1) as int)
             , cast(regexp_extract('7/1/2014 0:24', '[0-9]+/[0-9]+/[0-9]+ [0-9]+:([0-9]+)', 1) as int)
             , 0
             , 0 )
from DUAL limit 1

2014-07-01 00:24:00.000000