如何在pig中创建udf,以便对与另一个字段相关的列进行分类

x6h2sr28  于 2021-06-02  发布在  Hadoop
关注(0)|答案(2)|浏览(416)

我想用pig中的udf对一列和另一列进行分类。
我有数据

  1. Id,name,age
  2. 1,jhon,31
  3. 2,adi,15
  4. 3,sam,25
  5. 4,lina,28

预期产量

  1. 1,jhon,31,30-35
  2. 2,adi,15,10-15
  3. 3,sam,25,20-25
  4. 4,lina,28,25-30

请建议

dpiehjr4

dpiehjr41#

你不需要自定义项就可以做到这一点。假设您已将数据加载到关系a。

  1. B = FOREACH A GENERATE A.Id,A.name,A.age,(A.age%5 == 0 ? A.age-5 : (A.age/5)*5) as lower_age,(A.age%5 == 0 ? A.age : ((A.age/5)*5) + 5) as upper_age;
  2. C = FOREACH B GENERATE B.Id,B.name,B.age,CONCAT(CONCAT((chararray)lower_age,'-'),(chararray)upper_age);
  3. DUMP C;
eaf3rand

eaf3rand2#

您可以在eclipse中创建pig udf
在eclipse中使用pig jars创建一个项目,并尝试以下代码

  1. package com;
  2. import java.io.IOException;
  3. import org.apache.pig.EvalFunc;
  4. import org.apache.pig.backend.executionengine.ExecException;
  5. import org.apache.pig.data.Tuple;
  6. public class Age extends EvalFunc<String>{
  7. @Override
  8. public String exec(Tuple a) throws IOException {
  9. // TODO Auto-generated method stub
  10. if(a == null || a.size() == 0){
  11. return null;
  12. }
  13. try{
  14. Object object = a.get(0);
  15. if(object == null){
  16. return null;
  17. }
  18. int i = (Integer) object;
  19. if(i >= 10 && i <= 20 ){
  20. return "10-20";
  21. }
  22. else if (i >= 21 && i <= 30){
  23. return "20-30";
  24. }
  25. else
  26. return ">30";
  27. } catch (ExecException e){
  28. throw new IOException(e);
  29. }
  30. }
  31. }

现在将项目导出为jar并在pig shell中注册

  1. REGISTER <path of your .jar file>

用包和类来定义它。

  1. DEFINE U com.Age();
  2. a = LOAD '<input path>' using PigStorage(',') as (id:int,name:chararray,age:int);
  3. b = FOREACH a GENERATE id,name,age,U(age);
展开查看全部

相关问题