我有一个映射到某个目录的配置单元外部表。 该目录包含多个文件。
我想运行查询,例如查找文件名,其中有用户“abc”
select file_name , usr from usrs_tables where usr = "abc"
但当然数据里面没有包含文件名。
在MapReduce中,我可以通过
完成FileSplit fileSplit = (FileSplit)context.getInputSplit();
String filename = fileSplit.getPath().getName();
System.out.println("File name "+filename);
System.out.println("Directory and File name"+fileSplit.getPath().toString());
如何在Hive中执行此操作?
答案 0 :(得分:41)
是的,您可以使用名为INPUT__FILE__NAME
的虚拟列检索找到记录的文件,例如:
select INPUT__FILE__NAME, id, name from users where ...;
产生类似的东西:
hdfs://localhost.localdomain:8020/user/hive/warehouse/users/users1.txt 2 user2
hdfs://localhost.localdomain:8020/user/hive/warehouse/users/users2.txt 42 john.doe
如有必要,请使用提供的string functions修剪uri中的主机和目录。
您可以在此处找到有关虚拟列的文档:https://cwiki.apache.org/confluence/display/Hive/LanguageManual+VirtualColumns
答案 1 :(得分:4)
Hive中的每个表都有两个虚拟列。他们是
INPUT__FILE__NAME
BLOCK__OFFSET__INSIDE__FILE
INPUT__FILE__NAME
给出文件的名称。
BLOCK__OFFSET__INSIDE__FILE
是当前的全局文件位置。
假设我们想要找到与文件中每条记录对应的文件的名称。我们可以使用INPUT__FILE__NAME
列。此功能适用于0.8以上的Hive版本。下面给出一个小例子。
查询
select INPUT__FILE__NAME, name from customer_data;
这将为我们提供与每条记录对应的文件名。如果您想获取与hive表对应的文件名,以下查询将对您有所帮助。
select distinct(INPUT__FILE__NAME) from customer_data;
答案 2 :(得分:2)