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;
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';
2条答案
按热度按时间dwbf0jvd1#
更新
视图的可配置性似乎可以通过自定义项实现。我把先前的答案全部删掉。
为了显示上面的内容,我创建了一个简单的udf,它输出一个随机双精度。
并且,在hive中注册jar以创建我的自定义项:
假设我已经有了一张简单的table
sample
,创建视图时,如下所示:然后,接着
select *
在视图上,我得到了不同的结果。这意味着在每个涉及视图的语句上,都会调用udf。请记住,不能使用参数传递udf
${hiveconf:XXX}
,因为这将被计算并烘焙到视图定义中。因此,实现这种可配置性的方法是在udf类代码中获取配置。这个答案提到了如何
JobConfig
可以在配置单元自定义项中访问。我提出了一个相关的问题,即是否可以访问udf中的配置单元变量。如果你有答案(如果还没有答案的话)可以考虑帮忙。
亚历克斯,我想这是不可能的。
原因与第一种方法不起作用的原因相同。
形成视图的select查询将始终在创建视图时进行计算。因此,即使您已将某些变量传递给select查询中用于形成视图的udf,也会在该点对udf本身进行评估,以使视图具体化,并且视图内容在该点是固定的。
下次访问视图时(无
create or replace
),将不会重新调用自定义项。因此,除非您愿意调用与视图相关的dml查询以及
create or replace view
总是先运行,没有办法实现可配置视图。请看这个答案,以观察不管使用何种变量,视图始终是如何具体化的。udf的情况也是如此。
but5z9lq2#
@在第二种方法中,下面是访问
GenericUDF evaluate()
方法。您可以将变量存储到即时变量中,稍后再使用。代码在hive1.2上进行了测试
要测试代码:
构建自定义项jar
在hive cli上,执行以下命令: