我将一些文件放入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 。
我错过了什么,为什么桌子是空的?
环境:
答案 0 :(得分:3)
我认为您遇到的问题在HIVE-6431中进行了外围讨论。特别是,这个评论是重要的评论:
默认情况下,hadoop中的FileInputFormat(各种格式的超类)忽略文件名以“_”或“。”开头,并且很难在hive代码库中绕过它。
解决方法可能是避免使用以_
或.
答案 1 :(得分:2)
当您在Hive上运行任何命令时,它会在您存储文件的HDFS路径上作为MapReduce作业在内部运行。该作业使用FileInputFormat来读取具有hiddenFileFilter的HDFS文件,该文件忽略以下划线(" _")和("。")开头的任何文件。您可以通过将FileInputFormat.SetInputPathFilter设置为CustomPathFilter来实际设置要忽略的其他文件。 Hadoop使用带下划线的文件是"特殊"用于显示作业输出和日志的文件。这可能是他们被忽视的原因。