我正在研究一个用例,我们希望将元数据(例如加载时间、数据源…)作为hdfs扩展属性(xattrs)添加到原始文件中。我想知道是否有一种方法可以让hiveql在结果集中的查询中检索这样的元数据。这样可以避免在原始文件中的每个记录中存储这样的元数据。一个定制的Hive服务器会是一种提供这种xattrs的方式吗?否则,你有没有别的办法让这成为可能?我对这方面还比较陌生,所以如果我用错了术语,请容忍我。谢谢
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; } }
在查询非常大的数据集时,我没有测试它的性能。我希望扩展属性可以作为虚拟列直接检索,方式类似于使用虚拟列输入\文件\名称。
1条答案
按热度按时间bxpogfeg1#
可能还有其他方法来实现它,但是在我发现包含源hdfs文件url的hive虚拟列“input\u file\u name”之后,我用java创建了一个用户定义的函数来读取它的扩展属性。此函数可在配置单元查询中用作:
udf的(快速而肮脏的)java源代码如下所示:
在查询非常大的数据集时,我没有测试它的性能。我希望扩展属性可以作为虚拟列直接检索,方式类似于使用虚拟列输入\文件\名称。