我有一个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里做呢?
3条答案
按热度按时间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
brc7rcf02#
是的,您可以使用名为
INPUT__FILE__NAME
,例如:产生如下结果:
如果需要,可以使用提供的字符串函数从uri中修剪主机和目录。
您可以在此处找到有关虚拟列的文档:https://cwiki.apache.org/confluence/display/hive/languagemanual+virtualcolumns
uajslkp63#
配置单元中的每个表都有两个虚拟列。他们是
INPUT__FILE__NAME
BLOCK__OFFSET__INSIDE__FILEINPUT__FILE__NAME
提供文件名。BLOCK__OFFSET__INSIDE__FILE
是当前全局文件位置。假设我们想找到文件中每个记录对应的文件名。我们可以使用INPUT__FILE__NAME
列。此功能可从0.8以上的配置单元版本获得。下面给出一个小例子。查询
这将为我们提供每个记录对应的文件名。如果要获取与配置单元表对应的文件名,下面的查询将帮助您。