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

How to pass configurations from hive script to UDF

在 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?例如,如果我在配置单元脚本中有 set MY_CONF='foobar',我如何在需要消耗 MY_CONF 的值的 java UDF 中检索它?

有很多示例,已共享,​​因此您可以在 google 上找到所有必需的详细信息 :)。

分享中描述的一个小例子 link:

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

请检查 link 以供参考,我通常习惯于: Link1 Link2

而不是扩展 UDF class,您可以尝试子classing GenericUDF。此 class 具有以下您可以覆盖的方法:

/**
 * 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();  
}

转到配置单元命令行

hive> set MY_CONF='foobar';

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

hive> set;

现在,假设您有以下
罐子: MyUDF.jar
UDF calss: MySampleUDF.java 接受字符串值。
Table:员工

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

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

1.覆盖 GenericUDF

的配置方法
  @Override
   public void configure(MapredContext context) {
       super.configure(context);
       someProp = context.getJobConf().get(HIVE_PROPERTY_NAME);
   }

上述 (1) 并非在所有情况下都适用。仅适用于 MapredContext。 每个查询都必须强制执行 map/reduce 个作业,才能执行此设置

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

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

2。使用 SessionState

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