我有一个映射到某个目录的配置单元外部表.该目录包含多个文件.
我想运行查询,如找到文件名,其中有一个用户"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中的每个表都有两个虚拟列。他们是
INPUT__FILE__NAMEBLOCK__OFFSET__INSIDE__FILEINPUT__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)
| 归档时间: |
|
| 查看次数: |
29422 次 |
| 最近记录: |