【问题标题】:how to get input file name as column within hive query如何在配置单元查询中获取输入文件名作为列
【发布时间】:2013-05-23 13:54:45
【问题描述】:

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

我想在有用户“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 中做到这一点?

【问题讨论】:

    标签: hadoop hive


    【解决方案1】:

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

    如有必要,请使用提供的string functions 从 uri 中修剪主机和目录。

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

    【讨论】:

    • 非常感谢!这很有帮助!特别是,如果我们从创建为外部 hive 表的大量日志文件中搜索某些内容,我们将了解匹配的文件名以获得进一步的见解。
    • @jkovacs Presto 中是否有 INPUT__FILE__NAME 的等价物?
    【解决方案2】:

    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;
    

    【讨论】:

      【解决方案3】:

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

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

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

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

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

      • ROW__OFFSET__INSIDE__BLOCK
      • RAW__DATA__SIZE
      • ROW__ID
      • GROUPING__ID

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2018-07-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-10-16
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多