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

Posted

技术标签:

【中文标题】如何将参数传递给配置单元视图,以便视图根据传递的内容进行更改?【英文标题】:How to pass a parameter to hive view so that the view changes based on what's passed? 【发布时间】:2018-04-16 20:08:35 【问题描述】:

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

【问题讨论】:

【参考方案1】:

更新

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

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

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

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

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

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

构成视图的选择查询将始终在创建视图时进行评估。因此,即使您已将某些变量传递给在选择查询中用于形成视图的 UDF,UDF 也会在该点自身进行评估以具体化视图,并且此时视图内容是固定的。

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

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

请参阅此answer 以观察视图是如何始终物化的,而与使用的变量无关。 UDF 也是如此。

【讨论】:

你认为即使视图会访问一个getJobConf并从中获取一个变量,它仍然是不可能的吗? @AlexStrong,似乎是可能的。更新了我的答案。【参考方案2】:

@Alex - 在您的第二种方法中,以下是在 GenericUDF evaluate() 方法中访问 hive conf 值的方法。您可以将变量存储为即时变量并稍后使用。

@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 上测试

测试代码:

    构建 UDF 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';
    

【讨论】:

以上是关于如何将参数传递给配置单元视图,以便视图根据传递的内容进行更改?的主要内容,如果未能解决你的问题,请参考以下文章

将参数传递给视图转换

如何将条目参数传递给 Xamarin MVVM 视图模型

Codeigniter - 如何将 JSON 作为参数传递给视图 [重复]

如何使用底部导航视图和 Android 导航组件将参数传递给片段?

如何正确地将参数传递给 Django 中的基于类的视图实例?

CodeIgniter:将参数从视图传递到控制器?