Hive创建空表,即使有足够的文件

时间:2015-01-27 22:16:45

标签: hadoop hive

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

63  EB44863EA74AA0C5D3ECF3D678A7DF59
62  FABBC9ED9719A5030B2F6A4591EDB180
59  6BF6D40AF15DE2D7E295EAFB9574BBF8

所有这些都命名为_user_hive_warehouse_file_name_000XYZ_A。这些文件是从另一个hdfs下载的。

我试图通过Hive创建外部表格;

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;返回为空

select count(1) from users;返回 0

Hive成功创建表,但它始终为空。如果我将另一个文件(例如another.txt)包含上面提到的示例数据,则select count(1) from users;会返回 3

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

环境

  • JDK 7
  • Hadoop 2.6.0
  • Hive 0.14.0
  • Ubuntu 14.04

2 个答案:

答案 0 :(得分:3)

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

  

默认情况下,hadoop中的FileInputFormat(各种格式的超类)忽略文件名以“_”或“。”开头,并且很难在hive代码库中绕过它。

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

开头的文件名

答案 1 :(得分:2)

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