我正在研究一个用例,我们希望将原始文件中的元数据(例如加载时间,数据源...)添加为HDFS扩展属性(xattrs)。 我想知道HiveQL是否有办法在结果集中的查询中检索此类元数据。 这将避免在原始文件中的每个记录中存储这样的元数据。 自定义Hive SerDe是否可以提供这样的xattrs?否则,您是否看到了另一种方法来实现这一目标?
我仍然相对较新,所以如果我误用了条款,请耐心等待。
由于
答案 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。