代码之家  ›  专栏  ›  技术社区  ›  Aleksejs R

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

  •  1
  • Aleksejs R  · 技术社区  · 6 年前

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

    2 回复  |  直到 6 年前
        1
  •  1
  •   sujit    6 年前

    使现代化

    视图的可配置性似乎可以通过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';
    

    假设我已经有一个简单的表 sample ,当我创建视图时,如下所示:

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

    然后连续 select * 在观点上,我得到了不同的结果。这意味着在涉及视图的每个语句上,都会发生UDF调用。

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

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

    我提出了一个相关的 Question 是否可以访问UDF中的配置单元变量。如果你有答案(如果仍然没有答案),可以考虑提供帮助。

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

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

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

    下次访问视图时(无 create or replace ),将不会重新调用UDF。

    因此,除非您愿意调用与视图相关的DML查询以及 create or replace view 始终运行之前,无法实现可配置视图。

    看到这个了吗 answer 观察无论使用何种变量,观点始终是如何具体化的。UDF的情况也是如此。

        2
  •  1
  •   Gyanendra Dwivedi    6 年前

    @Alex-在第二种方法中,下面是访问 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);
        }
    }
    

    该代码在hive 1.2上进行了测试

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

    1. 构建UDF Jar
    2. 在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';