含DATE类型列的Hive表能否用Impala查询?遇类型不支持异常如何解决?
问题1:包含DATE类型列的Hive表是否可以使用Impala进行查询?
答案是分版本情况:早期的Impala版本(比如1.4及之前)对Hive原生的DATE类型支持非常有限,几乎无法直接查询;但从Impala 1.5版本开始,已经正式兼容Hive的DATE类型了。不过如果你的Impala版本偏低,或者Hive与Impala之间的元数据没有同步到位,还是可能出现查询失败的情况。
问题2:查询时抛出AnalysisException: Unsupported type 'DATE'异常的解决办法
针对这个报错,我整理了几个可行的解决思路,按优先级推荐:
1. 检查并升级Impala版本
首先确认你的Impala版本是否支持DATE类型,在终端执行以下命令查看版本:
impala-shell -v
如果版本低于1.5,建议升级到1.5及以上的稳定版本,这是从根源解决问题的方案。
2. 同步Hive与Impala的元数据
如果你的Impala版本已经支持DATE类型,但还是报错,大概率是Impala没有同步到最新的Hive表元数据。在Impala Shell中执行以下命令刷新元数据:
-- 刷新指定表的元数据 REFRESH myschema.mytable; -- 如果刷新单表无效,尝试刷新整个库的元数据 INVALIDATE METADATA myschema.mytable;
执行完成后再重新运行你的查询语句,一般就能正常识别DATE类型了。
3. 临时替代方案(无需升级版本)
如果暂时无法升级Impala版本,可以通过以下两种方式绕过DATE类型的限制:
创建Hive视图转换字段类型:在Hive中将DATE字段转换为STRING类型,然后在Impala中查询视图。示例语句:
-- 在Hive中创建视图 CREATE VIEW myschema.mytable_date_view AS SELECT CAST(day_dt AS STRING) AS day_dt_str, event, day_id FROM myschema.mytable;之后在Impala中查询这个视图:
SELECT day_dt_str FROM myschema.mytable_date_view;如果需要日期计算,还可以用Impala的
to_date()函数将字符串转回日期格式:SELECT to_date(day_dt_str) FROM myschema.mytable_date_view;直接在Impala中转换字段:如果DATE字段在存储层是按
yyyy-MM-dd格式的字符串存储的(TextInputFormat格式下Hive的DATE类型默认是这种存储方式),可以尝试直接用Impala的日期函数强制转换:SELECT to_date(CAST(b.day_dt AS STRING)) FROM myschema.mytable b;
针对你提供的示例代码补充说明
你的Hive建表语句使用了TextInputFormat存储格式,这种格式下DATE类型本质是按字符串存储的,只要Impala版本支持且元数据同步到位,应该可以正常查询。所以优先尝试前面提到的版本检查和元数据同步步骤。
内容的提问来源于stack exchange,提问作者Paul Mihai Stolniceanu

