猪:有没有可能在列表中的变量上写一个循环?
Pig: is it possible to write a loop over variables in a list?
我必须循环列表中的 30 多个变量
[var1,var2, ... , var30]
并且对于每个变量,我使用一些 PIG group by
语句,例如
grouped = GROUP data by var1;
data_var1 = FOREACH grouped{
GENERATE group as mygroup,
COUNT(data) as count;
};
有没有办法遍历变量列表,或者我被迫在我的代码中手动重复上面的代码 30 次?
谢谢!
我想你要找的是 pig macro
为您的 30 个变量创建一个关系,并通过 foreach 对它们进行迭代,并调用一个获取 2 个参数的宏:您的数据关系和您要分组的变量。
只需检查 link 中的示例,宏与您想要执行的操作非常相似。
更新和代码
所以这是您可以使用的宏:
DEFINE my_cnt(data, group_field) RETURNS C {
$C = FOREACH (GROUP $data by $group_field) GENERATE
group AS mygroup,
COUNT($data) AS count;
};
使用宏:
IMPORT 'cnt.macro';
data = LOAD 'data.txt' USING PigStorage(',') AS (field:chararray, value:chararray);
DESCRIBE data;
e = my_cnt(data,'the_field_you_group_by');
DESCRIBE e;
DUMP e;
我仍在考虑如何遍历要分组的字段。我最初的建议是通过包含归档名称的关系进行 foreach 不正确。 (为此创建一个 UDF 总是可行的。)让我考虑一下。
但是,如果您调用要分组的所有文件名,此宏将按原样工作。
我必须循环列表中的 30 多个变量
[var1,var2, ... , var30]
并且对于每个变量,我使用一些 PIG group by
语句,例如
grouped = GROUP data by var1;
data_var1 = FOREACH grouped{
GENERATE group as mygroup,
COUNT(data) as count;
};
有没有办法遍历变量列表,或者我被迫在我的代码中手动重复上面的代码 30 次?
谢谢!
我想你要找的是 pig macro
为您的 30 个变量创建一个关系,并通过 foreach 对它们进行迭代,并调用一个获取 2 个参数的宏:您的数据关系和您要分组的变量。 只需检查 link 中的示例,宏与您想要执行的操作非常相似。
更新和代码
所以这是您可以使用的宏:
DEFINE my_cnt(data, group_field) RETURNS C {
$C = FOREACH (GROUP $data by $group_field) GENERATE
group AS mygroup,
COUNT($data) AS count;
};
使用宏:
IMPORT 'cnt.macro';
data = LOAD 'data.txt' USING PigStorage(',') AS (field:chararray, value:chararray);
DESCRIBE data;
e = my_cnt(data,'the_field_you_group_by');
DESCRIBE e;
DUMP e;
我仍在考虑如何遍历要分组的字段。我最初的建议是通过包含归档名称的关系进行 foreach 不正确。 (为此创建一个 UDF 总是可行的。)让我考虑一下。 但是,如果您调用要分组的所有文件名,此宏将按原样工作。