我需要创建一个能够根据配置生成结果的可配置 View 。我的第一种方法是使用配置单元变量并将变量放在 View 中,但这不起作用,因为在创建 View 时,它采用变量的实际值( View 是静态的,无法配置)。第二种方法是调用 UDF 并从中访问变量。我认为这种方法可行,但我不知道如何正确编写它。您能否分享您的想法,也许可以体验如何解决这个问题。
最佳答案
更新
View 的可配置性似乎可以通过 UDF 实现。 我将完整地删除之前的答案。
为了如上所示,我创建了一个简单的 UDF,它输出一个随机 double 值。
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
,当我创建一个 View 时如下:
CREATE OR REPLACE VIEW view as
select *, myrand(1) from sample;
然后,在 View 上连续 select *
时,我得到了不同的结果。这意味着在涉及 View 的每个语句中,都会发生 UDF 调用。
请记住,UDF 不能使用 ${hiveconf:XXX}
传递参数,因为这将被评估并烘焙到 View 定义中。
因此,实现这种可配置性的方法是在 UDF 类代码中获取配置。这answer提到如何在配置单元 UDF 中访问 JobConfig
。
我提出了一个相关的Question关于是否可以在 UDF 中访问配置单元变量。如果您有答案(如果仍然没有答案),请考虑提供帮助。
亚历克斯,我认为这是不可能的。
原因同第一种方法行不通。
形成 View 的选择查询将始终在创建 View 时进行评估。因此,即使您已将一些变量传递给在选择查询中用于形成 View 的 UDF,UDF 也会在此时自行评估以具体化 View ,并且 View 内容在那时是固定的。
下次您访问 View 时(没有创建或替换
),UDF 将不会被重新调用。
因此,除非您愿意调用与 View 相关的 DML 查询以及一直运行的创建或替换 View
,否则无法实现可配置的 View 。
看这个answer观察 View 如何始终具体化,而不管使用的变量如何。 UDF 的情况也是如此。
关于hadoop - 如何将参数传递给配置单元 View ,以便 View 根据传递的内容进行更改?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49865429/