如何将参数传递给hive视图,以便视图根据传递的内容进行更改?

q3qa4bjr  于 2021-05-31  发布在  Hadoop
关注(0)|答案(2)|浏览(1219)

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

dwbf0jvd

dwbf0jvd1#

更新
视图的可配置性似乎可以通过自定义项实现。我把先前的答案全部删掉。
为了显示上面的内容,我创建了一个简单的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以创建我的自定义项:

hive> add jar <my-local-path>/myudf.jar;
hive> create temporary function myrand as 'com.example.hive.udf.MyRandom';

假设我已经有了一张简单的table sample ,创建视图时,如下所示:

CREATE OR REPLACE VIEW view as 
select *, myrand(1) from sample;

然后,接着 select * 在视图上,我得到了不同的结果。这意味着在每个涉及视图的语句上,都会调用udf。
请记住,不能使用参数传递udf ${hiveconf:XXX} ,因为这将被计算并烘焙到视图定义中。
因此,实现这种可配置性的方法是在udf类代码中获取配置。这个答案提到了如何 JobConfig 可以在配置单元自定义项中访问。
我提出了一个相关的问题,即是否可以访问udf中的配置单元变量。如果你有答案(如果还没有答案的话)可以考虑帮忙。
亚历克斯,我想这是不可能的。
原因与第一种方法不起作用的原因相同。
形成视图的select查询将始终在创建视图时进行计算。因此,即使您已将某些变量传递给select查询中用于形成视图的udf,也会在该点对udf本身进行评估,以使视图具体化,并且视图内容在该点是固定的。
下次访问视图时(无 create or replace ),将不会重新调用自定义项。
因此,除非您愿意调用与视图相关的dml查询以及 create or replace view 总是先运行,没有办法实现可配置视图。
请看这个答案,以观察不管使用何种变量,视图始终是如何具体化的。udf的情况也是如此。

but5z9lq

but5z9lq2#

@在第二种方法中,下面是访问 GenericUDF evaluate() 方法。您可以将变量存储到即时变量中,稍后再使用。

@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上进行了测试
要测试代码:
构建自定义项jar
在hive 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';

相关问题