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

Jul*_*ias 18 hadoop hive

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

我想运行查询,如找到文件名,其中有一个用户"abc"

 select file_name , usr from usrs_tables where usr = "abc"
Run Code Online (Sandbox Code Playgroud)

但当然数据中不包含文件名.

在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());
Run Code Online (Sandbox Code Playgroud)

我怎么能在Hive中做到这一点?

jko*_*acs 44

是的,您可以使用名为的虚拟列检索找到记录的文件INPUT__FILE__NAME,例如:

select INPUT__FILE__NAME, id, name from users where ...;
Run Code Online (Sandbox Code Playgroud)

产生如下:

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
Run Code Online (Sandbox Code Playgroud)

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

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


小智 6

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;
Run Code Online (Sandbox Code Playgroud)

这将为我们提供与每个记录相对应的文件名。如果要获取与配置单元表相对应的文件名,以下查询将为您提供帮助。

select distinct(INPUT__FILE__NAME) from customer_data;
Run Code Online (Sandbox Code Playgroud)