在hiveql中读取hdfs扩展属性

nfzehxib  于 2021-06-26  发布在  Hive
关注(0)|答案(1)|浏览(398)

我正在研究一个用例,我们希望将元数据(例如加载时间、数据源…)作为hdfs扩展属性(xattrs)添加到原始文件中。我想知道是否有一种方法可以让hiveql在结果集中的查询中检索这样的元数据。这样可以避免在原始文件中的每个记录中存储这样的元数据。一个定制的Hive服务器会是一种提供这种xattrs的方式吗?否则,你有没有别的办法让这成为可能?
我对这方面还比较陌生,所以如果我用错了术语,请容忍我。
谢谢

bxpogfeg

bxpogfeg1#

可能还有其他方法来实现它,但是在我发现包含源hdfs文件url的hive虚拟列“input\u file\u name”之后,我用java创建了一个用户定义的函数来读取它的扩展属性。此函数可在配置单元查询中用作:

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;
  }
}

在查询非常大的数据集时,我没有测试它的性能。我希望扩展属性可以作为虚拟列直接检索,方式类似于使用虚拟列输入\文件\名称。

相关问题