union all impala注意事项

852 阅读1分钟
create table table1 stored as parquet
as 
with 
DDXX AS (
...
),
DDXX1 AS (
...
)
select T1.* ,
'*物资' AS `物资*`
from ABC T1
WHERE T1.`*金额` != 0
UNION ALL
SELECT T1.*,
'*物资' AS `物资*`
FROM ABC T1
WHERE T1.`非*金额` !=0

问题:上面的语句在hive下执行正常,并且在hive下能够查询返回数据;在impala下查询存在表,但无数据。

排查办法:

1、使用refresh tablename和invalidate metadata tablename后还是无数据;

2、检查hdfs存储路径。通过desc tablename查询表的存储路径,检查数据存储路径。 发现数据多了一层目录,这导致了impala查询无法返回数据。

/apps/hive/warehouse/*.db/table1
hadoop fs -ls /apps/hive/warehouse/*.db/table1

结论:脚本里存在union all语句,在hdfs目录结构会多出一层,导致impala无法访问到具体数据。这算是hive与impala存储上的区别,impala本身机制。

解决办法:避免最终写入数据时使用union all,可以先建表再将数据写入,或者先写入临时表,再写入最终表。另外经测试使用union不会存在多目录层级。