Impala中to_date(VARCHAR(26))触发AnalysisException的修正问询
修正Impala中to_date(VARCHAR)的AnalysisException错误
错误原因
Impala的to_date()函数仅支持DATE或TIMESTAMP类型的输入参数,而你的b.response_date字段是VARCHAR(26)类型,直接传入会触发参数签名不匹配的错误。
修正方案
针对格式为yyyy-MM-dd HH:mm:ss的字符串日期,有两种可靠的修正方式:
方式1:先将字符串转为TIMESTAMP再提取日期
使用cast()函数把VARCHAR类型的日期字符串转换为TIMESTAMP,再传入to_date():
select a.*, b.* from impala.table a left join impala.teableb b on a.key = b.key where to_date(cast(b.response_date as timestamp)) between date_trunc('month', now()) - interval 1 month AND date_trunc('day', now()) - interval 1 day
方式2:指定格式解析字符串日期
如果日期字符串格式存在变动风险,可以用unix_timestamp()指定格式解析后再转换为日期:
select a.*, b.* from impala.table a left join impala.teableb b on a.key = b.key where to_date(from_unixtime(unix_timestamp(b.response_date, 'yyyy-MM-dd HH:mm:ss'))) between date_trunc('month', now()) - interval 1 month AND date_trunc('day', now()) - interval 1 day
额外注意点
你当前使用LEFT JOIN,若b表无匹配行,b.response_date会为NULL,上述转换后结果也为NULL,会被BETWEEN条件过滤,效果等同于INNER JOIN。如果需要保留a表所有行,可调整条件为:
where (b.response_date is null OR to_date(cast(b.response_date as timestamp)) between date_trunc('month', now()) - interval 1 month AND date_trunc('day', now()) - interval 1 day)
内容的提问来源于stack exchange,提问作者user21529908
相关产品推荐
相关产品推荐

