如何在配置单元查询中获取作为列的输入文件名

zwghvu4y  于 2021-06-04  发布在  Hadoop
关注(0)|答案(3)|浏览(322)

我有一个Map到某个目录的配置单元外部表。此目录包含多个文件。
我想在有用户“”的地方运行像find file name这样的查询

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里做呢?

xqk2d5yq

xqk2d5yq1#

hive 0.8.0支持两个虚拟列:
一个是 INPUT__FILE__NAME ,这是Map程序任务的输入文件名。
另一个是 BLOCK__OFFSET__INSIDE__FILE ,这是当前全局文件位置。
对于块压缩文件,它是当前块的文件偏移量,即当前块的第一个字节的文件偏移量。
自hive 0.8.0以来,添加了以下虚拟列:
块内的行偏移量
原始数据大小
行id
分组\uu id
已更新配置单元中虚拟列的链接:https://cwiki.apache.org/confluence/display/hive/languagemanual+virtualcolumns

brc7rcf0

brc7rcf02#

是的,您可以使用名为 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

uajslkp6

uajslkp63#

配置单元中的每个表都有两个虚拟列。他们是 INPUT__FILE__NAME BLOCK__OFFSET__INSIDE__FILE INPUT__FILE__NAME 提供文件名。 BLOCK__OFFSET__INSIDE__FILE 是当前全局文件位置。假设我们想找到文件中每个记录对应的文件名。我们可以使用 INPUT__FILE__NAME 列。此功能可从0.8以上的配置单元版本获得。下面给出一个小例子。
查询

select INPUT__FILE__NAME, name from customer_data;

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

select distinct(INPUT__FILE__NAME) from customer_data;

相关问题