25

我有一个映射到某个目录的配置单元外部表。这个目录包括几个文件。

我想运行查询,例如查找有用户“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 中做到这一点?

4

3 回答 3

55

是的,您可以使用名为 的虚拟列检索找到记录的文件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

如有必要,使用提供的字符串函数从 uri 中修剪主机和目录。

您可以在此处找到有关虚拟列的文档:https ://cwiki.apache.org/confluence/display/Hive/LanguageManual+VirtualColumns

于 2013-05-23T16:47:34.037 回答
8

Hive 中的每个表都有两个虚拟列。他们是

  1. INPUT__FILE__NAME
  2. 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;
于 2016-03-23T10:34:19.950 回答
4

Hive 0.8.0 提供对两个虚拟列的支持:

一个是INPUT__FILE__NAME,它是映射器任务的输入文件的名称。

另一个是BLOCK__OFFSET__INSIDE__FILE,它是当前全局文件位置。

对于块压缩文件,它是当前块的文件偏移量,也就是当前块的第一个字节的文件偏移量。

从 Hive 0.8.0 开始,添加了以下虚拟列:

  • ROW__OFFSET__INSIDE__BLOCK
  • RAW__DATA__SIZE
  • 行__ID
  • 分组__ID

更新了 hive 中虚拟列的链接: https ://cwiki.apache.org/confluence/display/Hive/LanguageManual+VirtualColumns

于 2014-01-15T20:13:30.637 回答