How to pass Hive conf variable in hive udf?

2020-04-28 07:43发布

问题:

I want to pass hive conf variable to hive UDF.

below is a code snippet.

hive -f ../hive/testHive.sql -hivevar testArg=${testArg}

Below is hive UDF call.

select setUserDefinedValueForColumn(columnName,'${testArg}') from testTable;

In udf I am getting value of testArg as null.

Please advice me how to use hive conf variable in udf and how to access Hive configuration in hive UDF?

回答1:

I think that you should pass hive variable as 'hiveconf' using below command:

hive --hiveconf testArg="my test args" -f ../hive/testHive.sql

Then you may have below code inside a GenericUDF evaluate() method:

@Override
 public Object evaluate(DeferredObject[] args) throws HiveException {
    String myconf;
    SessionState ss = SessionState.get();
    if (ss != null) {
        HiveConf conf = ss.getConf();
        myconf= conf.get("testArg");
        System.out.println("sysout.myconf:"+ myconf);
    }
}

The code is tested on hive 1.2



回答2:

You can't pass a Hive variable directly to the view by using ${hiveconf:testArg} in the view code because during the view creation Hive will take exactly value of the variable so the view will be static.

The only opportunity is to use UDF to access hive variable:

You can use GenericUDF. It has a method configure which takes MapredContext as a parameter. So, you need to specify a configure method in GenericUDF, like :

public void configure(MapredContext context){
 yourVar = context.getJobConf().get("hive_variable");
}

This is only called in runtime of MapRedTask.