Hadoop 如何将参数传递给配置单元视图,以便视图根据传递的内容进行更改?

Hadoop 如何将参数传递给配置单元视图,以便视图根据传递的内容进行更改?,hadoop,view,hive,user-defined-functions,Hadoop,View,Hive,User Defined Functions,我需要创建一个可配置的视图,它将能够根据配置生成结果。我的第一种方法是使用配置单元变量并在视图中放置一个变量,但这不起作用,因为在创建视图时,它会获取一个变量的实际值。视图是静态的,无法配置。第二种方法是调用UDF并从中访问变量。我认为这种方法会奏效,但我不知道如何正确地编写它。你能分享一下你的想法吗?也许你能体验一下如何解决这个问题 更新 视图的可配置性似乎可以通过UDF实现。 我把先前的答案全部删掉了 为了显示以上内容,我创建了一个简单的UDF,它输出一个随机双精度 package com.

我需要创建一个可配置的视图,它将能够根据配置生成结果。我的第一种方法是使用配置单元变量并在视图中放置一个变量,但这不起作用,因为在创建视图时,它会获取一个变量的实际值。视图是静态的,无法配置。第二种方法是调用UDF并从中访问变量。我认为这种方法会奏效,但我不知道如何正确地编写它。你能分享一下你的想法吗?也许你能体验一下如何解决这个问题

更新

视图的可配置性似乎可以通过UDF实现。 我把先前的答案全部删掉了

为了显示以上内容,我创建了一个简单的UDF,它输出一个随机双精度

package com.example.hive.udf;
public final class MyRandom extends UDF {
    public double evaluate(final double d) {
    Random r = new Random(System.currentTimeMillis());
    return r.nextDouble();
    }
}
并且,向hive注册jar以创建我的udf:

hive> add jar <my-local-path>/myudf.jar;
hive> create temporary function myrand as 'com.example.hive.udf.MyRandom';
然后,在视图上连续选择*,我得到不同的结果。这意味着在涉及视图的每个语句上,都会发生UDF调用

请记住,不能使用${hiveconf:XXX}传递UDF参数,因为这将被计算并烘焙到视图定义中

因此,实现这种可配置性的方法是在UDF类代码中获取配置。这提到了如何在配置单元UDF中访问JobConfig

我提出了一个相关问题,即是否可以在UDF中访问配置单元变量。如果你还没有答案,请考虑帮助。

亚历克斯,我认为这是不可能的

原因与第一种方法不起作用的原因相同

形成视图的select查询将始终在创建视图时进行计算。因此,即使您已将一些变量传递给select查询中用于形成视图的UDF,UDF也将在该点本身进行评估,以实现视图,并且视图内容在当时是固定的

下次访问视图而不创建或替换时,将不会重新调用UDF

因此,除非您愿意调用与视图相关的DML查询以及之前始终运行的创建或替换视图,否则无法实现可配置视图


查看此项以观察视图始终是如何具体化的,而不考虑所使用的变量。UDF的情况也是如此。

@Alex-在第二种方法中,下面是在GenericUDF求值方法中访问配置单元配置值的方法。您可以将变量存储到即时变量中,以后再使用

@Override
public ObjectInspector evaluate(ObjectInspector[] args) throws UDFArgumentException {
    String myconf;
    SessionState ss = SessionState.get();
    if (ss != null) {
        HiveConf conf = ss.getConf();
        myconf= conf.get("my.hive.conf");
        System.out.println("sysout.myconf:"+ myconf);
    }
}
该代码在Hive1.2上进行了测试

要测试代码,请执行以下操作:

构建UDF Jar 在配置单元CLI上,执行以下命令:

SET hive.root.logger=INFO,console;
SET my.hive.conf=test;
ADD JAR /path/to/the/udf/jar;
CREATE TEMPORARY FUNCTION test_udf AS com.example.my.udf.class.qualified.classname';

您是否认为即使视图将访问getJobConf并从中获取变量,这仍然是不可能的?@AlexStrong,似乎是可能的。更新了我的答案。
SET hive.root.logger=INFO,console;
SET my.hive.conf=test;
ADD JAR /path/to/the/udf/jar;
CREATE TEMPORARY FUNCTION test_udf AS com.example.my.udf.class.qualified.classname';