我最后使用猪拉丁语获得了以下数据
(所有,{((1,A),(3,B),(2,d))})
现在我需要找到第一个数字的最大值(1/2/3),然后显示整个元组。我希望输出为3,b。
请帮我怎么用猪拉丁语写这个。
答案 0 :(得分:1)
让我们加载并分组名为emp
的关系,然后找到具有最高薪水的emp
。
emp = load '' USING PigStorage() AS (employee_id:int, employee_name:chararray, job:chararray, mgr:int, hiredate:datetime, salary:int, commission:int, department_no:int);
emp_salary_id_mgr = foreach emp generate salary, employee_name;
emp_grouped = group emp_salary_id_mgr all;
(all,{(5000,KING),(2850,BLAKE),(2450,CLARK),(2975,JONES),(3000,SCOTT),(3000,FORD),(800,SMITH),(1600,ALLEN),(1250,WARD),(1250,MARTIN),(1500,TURNER),(1100,ADAMS),(950,JAMES),(1300,MILLER),(10000,KPIYA),(1300,KILLER)})
让我们描述分组关系
emp_grouped: {group: chararray,emp_salary_id_mgr: {(salary: int,employee_name: chararray)}}
让我们找到最高工资
sal_max = foreach emp_grouped generate MAX(emp_salary_id_mgr.salary) AS max_salary_val;
(10000)
但是我们需要找到整行(10000,KPIYA),所以让我们执行连接
emp_grouped_join_sal_max = JOIN emp_grouped by emp_salary_id_mgr.salary , sal_max BY max_salary_val;
- 错误消息'无法合并连接密钥,不兼容的类型'
现在我们需要压平包,以便我们可以执行JOIN
emp_grouped_flattened = foreach emp_grouped GENERATE FLATTEN($1);
emp_joined_maxsal = JOIN emp_grouped_flattened by emp_salary_id_mgr::salary, sal_max by max_salary_val;
emp_output = foreach emp_joined_maxsal generate TOTUPLE(emp_grouped_flattened::emp_salary_id_mgr::salary,emp_grouped_flattened::emp_salary_id_mgr::employee_name);
输出如下所示,与所需的相同 的((10000,KPIYA))强>
答案 1 :(得分:0)
获得最大值的步骤:
A = load 'pdemo/sample' using Pigstorage(',') as(id:int,name:chararray);
grp = group A all;
res = foreach grp generate MAX(A.id) as max;
ij = join A by id,res by max;
fresult = foreach ij generate A::id,A::name;
dump fresult
希望这会有所帮助..
答案 2 :(得分:0)
flattensum1 = FOREACH sumcolors1 GENERATE
FLATTEN(TOBAG(TOTUPLE($0,$1),TOTUPLE($2,$3),TOTUPLE($4,$5));
orderflattensum1 = ORDER flattensum1 by $0 desc;
limitorderflattensum1 = LIMIT orderflattensum1 1;
我退了一步我的数据。我把这个作为输入(1,a),(3,b),(2,d) 而不是对它们进行分组,我使用上面的语句将它们作为单独的行,然后通过desc对它进行排序。然后将行限制为1.
无论如何,谢谢你的回复。我也会尝试你的回复。