我想在猪脚本中读取一个属性。其他一些作业产生该属性的值并将其写入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 ;
有人可以帮我吗?
答案 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方式,但是它有效!