Hadoop 配置单元设置()-类似于映射器设置()的功能?

Hadoop 配置单元设置()-类似于映射器设置()的功能?,hadoop,hive,Hadoop,Hive,我想用Hive替换Hadoop作业。我的挑战是在Hadoop中,我使用setup()通过从分布式缓存中读取引用数据(兴趣点)来构建kdtree。然后,我使用map()中的kdtree来计算目标数据相对于kdtree的距离 在Hive中,我想使用udf with evaluate()方法来确定距离,但我不知道如何使用引用数据设置kdtree。这可能吗?我可能没有完整的答案,所以我想提出一些可能有用的想法 您可以使用添加文件… Hive11+(我认为)应该允许您访问GenericUDF.initi

我想用Hive替换Hadoop作业。我的挑战是在Hadoop中,我使用setup()通过从分布式缓存中读取引用数据(兴趣点)来构建kdtree。然后,我使用map()中的kdtree来计算目标数据相对于kdtree的距离


在Hive中,我想使用udf with evaluate()方法来确定距离,但我不知道如何使用引用数据设置kdtree。这可能吗?

我可能没有完整的答案,所以我想提出一些可能有用的想法

  • 您可以使用
    添加文件…
  • Hive11+(我认为)应该允许您访问
    GenericUDF.initialize中的分布式缓存
    
    • 其中提到

因此,在初始化UDF时,可以通过访问添加到分布式缓存中的文件来构建kdtree

就像爬山说的那样,
addfile
命令将文件添加到分布式缓存中。 只需打开当前目录中的文件,即可访问UDF中的分布式缓存。 即<代码>打开(新文件(System.getProperty(“user.dir”)+“/myfile”)

您可以使用ConstantObjectInspector在
GenericUDF
initialize
方法中访问文件名,在该方法中,您可以打开文件并将其读入内存到数据结构中

Brickhouse的
distributed_map
UDF做了类似的事情()

差不多

public ObjectInspector initialize(ObjectInspector[] inspArr) {
   ConstantObjectInspector fileNameInsp = (ConstantObjectInspector)inspArr[0];
   String fileName = fileNameInsp.getWritableConstantValue().toString();
   FileInputStream inFile = new FileInputStream("./" + fileName);
   doStuff( inFile ); 
   .....
}