如何将参数传递给配置单元视图,以便视图根据传递的内容进行更改?
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';
【讨论】:
以上是关于如何将参数传递给配置单元视图,以便视图根据传递的内容进行更改?的主要内容,如果未能解决你的问题,请参考以下文章
Codeigniter - 如何将 JSON 作为参数传递给视图 [重复]
如何使用底部导航视图和 Android 导航组件将参数传递给片段?