如何在hive查询中获取输入文件名作为列

时间:2013-05-23 13:54:45

标签: hadoop hive

我有一个映射到某个目录的配置单元外部表。 该目录包含多个文件。

我想运行查询,例如查找文件名,其中有用户“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中执行此操作?

3 个答案:

答案 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中的每个表都有两个虚拟列。他们是

  1. INPUT__FILE__NAME
  2. BLOCK__OFFSET__INSIDE__FILE
  3. 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)