在Impala中创建HDFS外部表时,如何指定自定义时间戳解析格式?
解决Impala中自定义时间戳格式解析的问题
这个问题我之前处理过,确实是Impala默认的timestamp解析规则不兼容你使用的dd/mm/yyyy hh:min格式,所以导致reported_time列全部为null。下面给你两种实用的解决办法:
方法一:查询时转换(简单直接)
先把表中的reported_time定义为string类型存储,查询的时候用Impala内置的STR_TO_TIMESTAMP函数指定自定义格式转换为timestamp类型:
- 重新创建外部表(如果之前的表可以删除的话):
create external table t ( number string, reported_time string ) ROW FORMAT delimited fields terminated BY ',' LOCATION 'path/to/file';
- 查询时转换时间格式:
SELECT number, STR_TO_TIMESTAMP(reported_time, 'dd/MM/yyyy HH:mm') AS reported_time FROM t;
这里要注意格式符的大小写:
dd代表两位数的日期MM代表两位数的月份(小写mm会被识别为分钟,一定要区分开)yyyy代表四位数的年份HH代表24小时制的小时(如果你的时间是12小时制,就用hh)mm代表两位数的分钟
方法二:创建表时指定SerDe(适合需要直接以timestamp类型存储的场景)
如果希望表中的reported_time直接是timestamp类型,可以使用Hive的OpenCSVSerDe,并通过参数指定时间格式。不过这种方式需要确保你的环境已经部署了对应的SerDe依赖:
CREATE EXTERNAL TABLE t ( number string, reported_time timestamp ) ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.OpenCSVSerde' WITH SERDEPROPERTIES ( 'separatorChar' = ',', 'timestamp.formats' = 'dd/MM/yyyy HH:mm' ) LOCATION 'path/to/file';
这种方式会让SerDe在读取数据时自动按照指定格式解析时间戳,不需要每次查询都转换。
需要注意的是,Impala默认的timestamp解析只支持ISO 8601标准格式(比如yyyy-MM-dd HH:mm:ss),所以自定义格式必须通过上述两种方式处理才能正确解析。
内容的提问来源于stack exchange,提问作者akilat90
相关产品推荐
相关产品推荐

