如何将配置从配置单元脚本传递到 UDF

Posted

技术标签:

【中文标题】如何将配置从配置单元脚本传递到 UDF【英文标题】:How to pass configurations from hive script to UDF 【发布时间】:2015-08-21 23:03:15 【问题描述】:

在 pig 中,您可以通过 UDFContext 将 pig 脚本中的配置传递给 pig UDF。例如,

// in pig script
SET my.conf dummy-conf

// in UDF java code
Configuration conf = UDFContext.getUDFContext().getJobConf();
String myConf = conf.get("my.conf");

那么,是否有类似的方法将配置从配置单元脚本传递到配置单元 UDF?例如,如果我在 hive 脚本中有 set MY_CONF='foobar',我如何在需要消耗 MY_CONF 的值的 java UDF 中检索它?

【问题讨论】:

【参考方案1】:

您可以尝试继承GenericUDF,而不是扩展UDF 类。该类具有以下可以覆盖的方法:

/**
 * Additionally setup GenericUDF with MapredContext before initializing.
 * This is only called in runtime of MapRedTask.
 *
 * @param context context
 */
public void configure(MapredContext context) 

MapredContext 有一个类似于 Pig 中的UDFContext 的方法来检索作业配置。因此,您可以执行以下操作:

@Override
public void configure(MapredContext context) 
    Configuration conf = context.getJobConf();  

【讨论】:

非常感谢您分享这个。它很好地解决了我的问题。【参考方案2】:

从 hive 1.2 开始,有 2 种方法。

1.从 GenericUDF 覆盖配置方法

  @Override
   public void configure(MapredContext context) 
       super.configure(context);
       someProp = context.getJobConf().get(HIVE_PROPERTY_NAME);
   

Above(1) 并非在所有情况下都有效。仅在 MapredContext 中有效。 每个查询都必须是强制 map/reduce 作业,才能做到这一点

set hive.fetch.task.conversion=minimal/none;
set hive.optimize.constant.propagation=false;

。 设置上述属性后,您将遇到主要的性能问题,尤其是对于较小的查询。

2。使用会话状态

 SessionState ss = SessionState.get();
     if (ss != null) 
          this.hiveConf = ss.getConf();
          someProp = this.hiveConf.get(HIVE_PROPERTY_NAME);
          LOG.info("Got someProp: " + someProp);
      

【讨论】:

【参考方案3】:

转到 hive 命令行

hive> set MY_CONF='foobar';

点击命令时应该列出你的变量

hive> set;

现在,考虑以下 Jar:MyUDF.jar UDF calss:MySampleUDF.java,它接受一个字符串值。 表格:员工

hive> ADD JAR /MyUDF.jar
hive> CREATE TEMPORARY FUNCTION testUDF AS 'youpackage.MySampleUDF';
hive> SELECT testUDF($MY_CONF) from employee;

【讨论】:

【参考方案4】:

有很多例子,共享的,所以你可以通过谷歌找到所有需要的细节:)。

共享链接中描述的一个小例子:

hive> ADD JAR assembled.jar;
hive> create temporary function hello as 'com.test.example.UDFExample';
hive> select hello(firstname) from people limit 10;

请查看我通常使用的参考链接: Link1 Link2

【讨论】:

我在询问将配置从调用 UDF 的配置单元脚本传递到 UDF。您的链接是关于如何编写配置单元 UDF,在这种情况下并不那么相关。 我的错,尽管您尝试过使用 Hive 资源link,它具有将一个或多个文件、jar 或存档添加/删除/存档到分布式缓存中的资源列表的功能。

以上是关于如何将配置从配置单元脚本传递到 UDF的主要内容,如果未能解决你的问题,请参考以下文章

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

如何在配置单元中为结构字段创建视图

如何在 Hive 中调用用户定义的函数?

如何将不连续的单元格传递给 Excel UDF

如何从 bash shell 脚本运行直线和配置单元查询

更新配置单元 UDF 的 jar