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

时间:2015-08-21 23:03:16

标签: java hadoop hive apache-pig

在猪中,您可以通过UDFContext将猪脚本中的配置传递给猪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',我如何在java UDF中检索它,需要消耗MY_CONF的值?

4 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:0)

Go to hive command line

hive> set MY_CONF='foobar';

your variable should be listed when hitting the command

hive> set;

Now, consider you have below
Jar: MyUDF.jar
UDF calss: MySampleUDF.java which accepts a String value.
Table: employee

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

答案 2 :(得分:0)

从配置单元1.2开始,有2种方法。

1。从GenericUDF覆盖配置方法

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

上述(1)不适用于所有情况。仅在MapredContext中工作。 每个查询都必须是强制映射/归约工作,才能做到这一点

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);
      }

答案 3 :(得分:-3)

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

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

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