1

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

我尝试使用以下脚本并且它有效。

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

但是当我通过 udf 中的参数时,pigscript 失败了。

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

有人可以帮我吗?

4

2 回答 2

1

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

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

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

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

我建议你DEFINE改用。根据Pig 文档

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

例如:

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;
于 2013-08-08T11:33:33.120 回答
0

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

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

我同意这不是解决问题的真正 Java 方式,但它确实有效!

于 2013-08-06T15:58:02.623 回答