我使用一个使用多个union all运算符的查询来填充镶木地板存储格式的分区Hive表。使用Tez执行查询,Tez使用默认设置导致多个并发Tez编写器创建HDFS结构,其中镶木地板文件位于分区文件夹下的子文件夹(文件夹名称为Tez writer ID)中。 例如。 /apps/hive/warehouse/scratch.db/test_table/part=p1/8/000000_0
即使在表上无效元数据和收集统计信息之后,Impala也会在查询表时返回零行。 问题似乎是Impala没有遍历分区子文件夹来查找镶木地板文件。
如果我将hive.merge.tezfiles设置为true(默认情况下为false),有效地强制Tez使用额外的处理步骤将多个文件合并为一个,生成的镶木地板文件直接写在分区文件夹下,刷新后,Impala可以查看新分区或更新分区中的数据。
我想知道是否有一个配置选项让Impala指示它查看分区子文件夹,或者是否有一个Impala补丁改变了它在这方面的行为。
答案 0 :(得分:4)
截至目前,Impala不支持从TABLE LOCATION下的子目录中递归读取文件。 示例:如果使用位置'/ home / data / input /'
创建表如果目录结构如下:
/home/data/input/a.txt
/home/data/input/b.txt
/home/data/input/subdir1/x.txt
/home/data/input/subdir2/y.txt
然后Impala只能从以下文件中查询
/home/data/input/a.txt /home/data/input/b.txt
不查询以下文件
/home/data/input/subdir1/x.txt
/home/data/input/subdir2/y.txt
作为替代解决方案,您可以从Hive读取数据并插入最终的Hive表。
在此表的顶部为交互式或报表查询创建Impala视图。
您可以使用以下配置设置在Hive中设置此功能。
Hive支持使用选项
的子目录扫描 SET mapred.input.dir.recursive=true;
和
SET hive.mapred.supports.subdirectories=true;