Hive 创建空 table,即使文件很多

Hive creates empty table, even there're plenty of file

我将一些文件放入 hdfs (/path/to/directory/) 中,其中包含如下数据;

63  EB44863EA74AA0C5D3ECF3D678A7DF59
62  FABBC9ED9719A5030B2F6A4591EDB180
59  6BF6D40AF15DE2D7E295EAFB9574BBF8

他们都被命名为_user_hive_warehouse_file_name_000XYZ_A。这些文件是从另一个 hdfs 下载的。

我正在尝试通过 Hive 创建外部 table;

CREATE EXTERNAL TABLE users(
id int,
user string
)
ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t'
LOCATION '/path/to/directory/';

它说;

OK
Time taken: 0.098 seconds

select * from users; returns .

select count(1) from users; returns 0.

Hive 成功创建了 table,但它始终为空。如果我放置另一个文件,如 another.txt,其中包含上述示例数据,select count(1) from users; returns 3.

我错过了什么,为什么 table 是空的?

环境:

我认为您遇到了 HIVE-6431 中外围讨论的问题。特别是,这条评论很重要:

By default, FileInputFormat(which is the super class of various formats) in hadoop ignores file name starts with "_" or ".", and hard to walk around this in hive codebase.

解决方法可能是避免使用以 _.

开头的文件名

当您在 Hive 上 运行 任何命令时,它在内部作为您存储文件的 HDFS 路径上的 MapReduce 作业 运行。该作业使用 FileInputFormat 读取具有 hiddenFileFilter 的 HDFS 文件,它会忽略任何以下划线 (“_”) 和 (“.”) 开头的文件。您实际上可以通过将 FileInputFormat.SetInputPathFilter 设置为 CustomPathFilter 来设置要忽略的其他文件。 Hadoop 使用带下划线的文件是 "special" 文件来显示作业输出和日志。这可能就是它们被忽略的原因。