Apache pig 猪的等级分组

Apache pig 猪的等级分组,apache-pig,Apache Pig,我有一个包含大量字段和行的数据集。我想按执行分层分组,但似乎不知道如何访问分组数据集中的字段 例如,假设我们有(id、名字、姓氏、年龄、电话、城市) 这些组的计算是正确的。当我尝试访问数据时遇到问题,例如: data_1 = FOREACH group_1 GENERATE group.age,group.phone,group.id,COUNT(student_details.city); data_2 = FOREACH group_2 GENERATE group.age,group.ph

我有一个包含大量字段和行的数据集。我想按执行分层分组,但似乎不知道如何访问分组数据集中的字段

例如,假设我们有(id、名字、姓氏、年龄、电话、城市)

这些组的计算是正确的。当我尝试访问数据时遇到问题,例如:

data_1 = FOREACH group_1 GENERATE group.age,group.phone,group.id,COUNT(student_details.city);
data_2 = FOREACH group_2 GENERATE group.age,group.phone,COUNT(group_1.student_details.city);
最后一行导致错误
在学生详细信息:bag{:tuple(id:int,firstname:chararray,lastname:chararray,age:int,phone:chararray,city:chararray)中找不到字段city}

是因为student_details是一个包,我需要为每个包运行一个for,才能访问包中的元组吗?有没有直截了当的方法

--更新--

样本数据:

001,Rajiv,Reddy,21,9848022337,Hyderabad
002,siddarth,Battacharya,22,9848022338,Kolkata
003,Rajesh,Khanna,22,9848022339,Delhi
004,Preethi,Agarwal,21,9848022330,Pune
005,Trupthi,Mohanthy,23,9848022336,Bhuwaneshwar
006,Archana,Mishra,23,9848022335,Chennai
007,Komal,Nayak,24,9848022334,trivendram
008,Bharathi,Nambiayar,24,9848022333,Chennai
009,ABC,DEF,111,9834534343,Delhi
009,ABC,DEF,111,9834534343,Delhi
009,ABC,DEF,111,9834534343,Delhi
如果我们运行以下代码,预期输出将完全相同:

student_details = LOAD 'student_details.txt' USING PigStorage(',') as (id:int,firstname:chararray,lastname:chararray,age:int,phone:chararray,city:chararray);
group_1 = GROUP student_details by (age,phone,id);
group_2 = GROUP student_details by (age,phone);
data_1 = FOREACH group_1 GENERATE group.age,group.phone,group.id,COUNT(student_details.city);
data_2 = FOREACH group_2 GENERATE group.age,group.phone,COUNT(student_details.city);
STORE data_1..
STORE data_2..
但我不想在第2行和第3行中两次使用student_详细信息

讨论在分组之后删除元组。我不想删除任何元组,我想对键的子集进行另一个分组
使用展平意味着我失去了在组1中执行的组

对于分层分组,您需要多维数据集操作。下面是一个可能解决您的问题的示例:

student_details = LOAD 'data.csv' USING PigStorage(',') as (id:int,firstname:chararray,lastname:chararray,age:int,phone:chararray,city:chararray);
cubed = CUBE student_details BY ROLLUP(age,phone,id);
result = FOREACH cubed GENERATE FLATTEN(group) as (age,phone,id),  COUNT_STAR(cube) as CNT;
result = FILTER result BY age is not NULL and phone is not NULL;
DUMP result;

您能发布示例数据和预期输出吗?当然,我会将其添加到问题中。它可能重复谈到在分组后删除元组。我不想删除任何元组,我想在键的子集上进行另一个分组,然后访问元组。感谢您的帮助,但是多维数据集操作符将在所有数据上执行聚合&在我的情况下,我不能这样做,因为属性的数量非常大&差异也是如此。例如,我可能需要
分组依据(a1、a2、a3、a4…a15)
和另一个
分组依据(a1、a2)
。所以我觉得在所有15个属性的所有组合中做一个立方体在计算上是非常昂贵的。如果我错了,请纠正我Rollup将限制排列的数量,但是这些操作是在内部实现的,并且非常有效,使用二次排序技巧和运行求和,不需要重复数据。在我的Expirence多维数据集和汇总中,从未导致任何性能问题。如果你发现它很慢,而且你的群组数量非常有限,你可以试着用谢谢你的回答,我想这是最接近解决我问题的方法。
student_details = LOAD 'data.csv' USING PigStorage(',') as (id:int,firstname:chararray,lastname:chararray,age:int,phone:chararray,city:chararray);
cubed = CUBE student_details BY ROLLUP(age,phone,id);
result = FOREACH cubed GENERATE FLATTEN(group) as (age,phone,id),  COUNT_STAR(cube) as CNT;
result = FILTER result BY age is not NULL and phone is not NULL;
DUMP result;