UDF在声明语句中使用

时间:2013-08-06 12:25:31

标签: apache-pig

我想在猪脚本中读取一个属性。其他一些作业产生该属性的值并将其写入hdfs。

我尝试使用以下脚本,但它确实有效。

%declare a com.company.Check();
x = LOAD '1' using PigStorage('^A') as (b:chararray);
y = FOREACH x GENERATE b,  $a ;

但是当我通过udf中的一个paremeter时,pigcript失败了。

%declare a com.comapny.Check($p);
x = LOAD '1' using PigStorage('^A') as (b:chararray);
y = FOREACH x GENERATE b,  $a ;

有人可以帮我吗?

2 个答案:

答案 0 :(得分:1)

%declare的用例是用其他(s)来描述一个参数 您可以使用%declare为自定义函数创建别名,但这无关 选择你想要使用的正确构造函数(如果你试图这样做,你最终会得到 语法错误)

在构造函数中具有参数的自定义加载函数可能会使用declare, 因为在它们的声明点(在using之后)你基本上定义了它们要使用的构造函数,所以你可以在这里传递所需的参数,例如:

register '/path/to/my.jar';
%declare loader 'MyLoader';
A = load 'data.txt' using loader('$p') as (f1:chararray);
...

但是,这种方法对UDF不起作用,因为在脚本的声明点,您将字段,元组..等传递给它们的exec方法。 (它们已经使用默认的noarg构造函数进行实例化)

我建议你改用DEFINE。根据{{​​3}}:

Use DEFINE to specify a UDF function when:
- ...
- The constructor for the function takes string parameters

E.g:

register '/path/to/my.jar';
DEFINE a com.comapny.Check('$p');
x = LOAD '1' using PigStorage('^A') as (b:chararray);
y = FOREACH x GENERATE b,  $a;

答案 1 :(得分:0)

这对我来说也不起作用,所以我决定改为运行shell命令

%DECLARE devices_path `echo "$device_input" | sed 's/^.*devices\///'`

我同意这不是一种解决问题的真正的java方式,但是它有效!