在HiveQL中读取HDFS扩展属性

时间:2016-01-27 14:42:00

标签: hive metadata hdfs

我正在研究一个用例,我们希望将原始文件中的元数据(例如加载时间,数据源...)添加为HDFS扩展属性(xattrs)。 我想知道HiveQL是否有办法在结果集中的查询中检索此类元数据。 这将避免在原始文件中的每个记录中存储这样的元数据。 自定义Hive SerDe是否可以提供这样的xattrs?否则,您是否看到了另一种方法来实现这一目标?

我仍然相对较新,所以如果我误用了条款,请耐心等待。

由于

1 个答案:

答案 0 :(得分:0)

可能还有其他方法可以实现它,但在我发现包含源HDFS文件的URL的Hive virtual column'INPUT__FILE__NAME'之后,我在Java中创建了一个用户定义函数来读取其扩展属性。此函数可在Hive查询中用作:

XAttrSimpleUDF(INPUT__FILE__NAME,'user.my_key')

UDF的(快速且脏的)Java源代码如下所示:

public class XAttrSimpleUDF extends UDF {

  public Text evaluate(Text uri, Text attr) {
    if(uri == null || attr == null) return null;

    Text xAttrTxt = null;
    try {
        Configuration myConf = new Configuration();

        //Creating filesystem using uri
        URI myURI = URI.create(uri.toString());
        FileSystem fs = FileSystem.get(myURI, myConf);

        // Retrieve value of extended attribute
        xAttrTxt = new Text(fs.getXAttr(new Path(myURI), attr.toString()));
    } catch (IOException e) {
        e.printStackTrace();
    } catch (Exception e) {
        e.printStackTrace();
    }
    return xAttrTxt;
  }
}

在查询非常大的数据集时,我没有测试它的性能。 我希望扩展属性可以像虚拟列一样直接检索,类似于使用虚拟列INPUT__FILE__NAME。