如何将配置从配置单元脚本传递到 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);
}
在 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);
}