我想用Hive替换Hadoop作业。我的挑战是在Hadoop中,我使用setup()通过从分布式缓存中读取参考数据(兴趣点)来构建kdtree。然后我使用map()中的kdtree来评估目标数据与kdtree的距离。
在Hive中,我想使用带有evaluate()方法的udf来确定距离,但我不知道如何使用参考数据设置kdtree。这可能吗?
答案 0 :(得分:0)
我可能没有完整的答案,所以我只想抛弃一些可能有帮助的想法。
ADD FILE ...
GenericUDF.initialize
中的分布式缓存
因此,在初始化UDF时,您可以通过访问在分布式缓存中添加的文件来构建kdtree。
答案 1 :(得分:0)
像climbage说ADD FILE
命令将文件添加到分布式缓存中。
只需打开当前目录中的文件,即可访问UDF中的分布式缓存。
即... open( new File( System.getProperty("user.dir") + "/myfile") );
您可以使用ConstantObjectInspector访问initialize
GenericUDF
方法中的文件名,您可以在其中打开文件并将内存读入数据结构中。
Brickhouse的distributed_map
UDF做了类似的事情(https://github.com/klout/brickhouse/blob/master/src/main/java/brickhouse/udf/dcache/DistributedMapUDF.java)
像
这样的东西public ObjectInspector initialize(ObjectInspector[] inspArr) {
ConstantObjectInspector fileNameInsp = (ConstantObjectInspector)inspArr[0];
String fileName = fileNameInsp.getWritableConstantValue().toString();
FileInputStream inFile = new FileInputStream("./" + fileName);
doStuff( inFile );
.....
}