0

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

即使在使元数据无效并收集表上的统计信息后,Impala 在查询表时也会返回零行。问题似乎在于 Impala 没有遍历分区子文件夹来查找 parquet 文件。

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

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

4

1 回答 1

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;

于 2017-11-10T08:01:21.487 回答