【问题标题】:How to find max of a tuple in pig latin如何在猪拉丁语中找到一个元组的最大值
【发布时间】:2016-12-27 19:29:40
【问题描述】:

我使用猪拉丁语最终得到了以下数据。
(全部,{((1,a),(3,b),(2,d))}) 现在我需要找到第一个数字的最大值(1/2/3)然后显示整个元组。我希望输出为 3,b。
请帮我用猪拉丁文写这个。

【问题讨论】:

  • 我已经回复了我的答案。不过我做的有点不同。

标签: apache-pig


【解决方案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)所以让我们执行join

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 个大代码块。如果我犯了错误,请编辑。
【解决方案2】:

获取最大值的步骤:

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 

希望这会有所帮助..

【讨论】:

    【解决方案3】:
    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。

    无论如何,感谢您的回复。我也会试试你的回答。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-18
      • 2018-03-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多