hadoop - pig : is it possible to write a loop over variables in a list?

标签 hadoop apache-pig cloudera

我必须循环列表中的 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 个参数的宏:您的数据关系和您要分组的变量。 只需检查链接中的示例,宏与您想要执行的操作非常相似。

更新和代码

下面是您可以使用的宏:

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 总是可行的。)让我考虑一下。 但是,如果您调用要分组的所有文件名,此宏将按原样工作。

关于hadoop - pig : is it possible to write a loop over variables in a list?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37029980/

相关文章:

java - 将特定依赖项打包到 jar 中

hadoop - 小数点后八位 pig

sql - 如何在Hive SQL中为日期列执行BETWEEN运算符

hadoop - 如何将 native 写的java代码集成到Serde中进行hive查询

hadoop - 从SequenceFileRecordReader返回错误的ByteArray

hadoop - 关于健康 cloudera hadoop(网络接口(interface)速度)

Hadoop依赖于两个不同版本的beanutils

hadoop - 如何在 Hadoop 上的 Apache Pig 中基于两个子包构建 super 包

hadoop - 在Pig Latin中使用TOBAG和STRSPLIT

java - NameNode 地址的 URI 无效