Impala 2.7 无法从使用 Tez 从 Hive 创建的镶木地板 table 中读取任何数据

Impala 2.7 fails to read any data from a parquet table created from Hive with Tez

我正在使用一个查询填充镶木地板存储格式的分区 Hive table,该查询使用多个 union all 运算符。查询是使用 Tez 执行的,默认设置会导致多个并发的 Tez 编写器创建 HDFS 结构,其中镶木地板文件位于分区文件夹下的子文件夹(文件夹名称为 Tez 编写器 ID)中。 例如。 /apps/hive/warehouse/scratch.db/test_table/part=p1/8/000000_0

即使在查询 table 时使元数据无效并收集 table、Impala returns 零行的统计信息。 问题似乎出在 Impala 没有遍历分区子文件夹以查找镶木地板文件。

如果我将 hive.merge.tezfiles 设置为 true(默认情况下为 false),有效地迫使 Tez 使用额外的处理步骤将多个文件合并为一个,生成的 parquet 文件直接写入分区文件夹下,然后刷新 Impala 可以看到新的或更新的分区中的数据。

我想知道 Impala 是否有一个配置选项来指示它在分区子文件夹中查找,或者 Impala 是否有一个补丁可以改变它在这方面的行为。

截至目前,Impala 不支持从 TABLE 位置下的子目录递归读取文件。 示例:如果 table 是使用位置 '/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 读取数据并插入到 Final Hive Table。

在此 table 之上创建一个 Impala 视图用于交互式或报告查询。

您可以使用以下配置设置在 Hive 中设置此功能。

Hive 支持带选项的子目录扫描

SET mapred.input.dir.recursive=true;

SET hive.mapred.supports.subdirectories=true;