【问题标题】:How to create UDF in pig for categorize columns with respect to another filed如何在 pig 中创建 UDF 以相对于另一个字段对列进行分类
【发布时间】:2018-03-29 10:53:40
【问题描述】:

我想在 pig 中使用 UDF 对一列相对于另一列进行分类。

我拥有的数据

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

预期输出

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

请推荐

【问题讨论】:

    标签: hadoop hdfs apache-pig pig-udf


    【解决方案1】:

    您可以在没有 UDF 的情况下执行此操作。假设您已将数据加载到关系 A。

    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;
    C = FOREACH B GENERATE B.Id,B.name,B.age,CONCAT(CONCAT((chararray)lower_age,'-'),(chararray)upper_age);
    DUMP C;
    

    【讨论】:

    • 感谢您的意见,能否请您告诉我上述要求的 UDF 流程。
    【解决方案2】:

    你可以在eclipse中创建pig udfs

    用猪罐子在eclipse中创建一个项目并尝试下面的代码

    package com;
    
    import java.io.IOException;
    
    import org.apache.pig.EvalFunc;
    import org.apache.pig.backend.executionengine.ExecException;
    import org.apache.pig.data.Tuple;
    
    
    
    public class Age extends EvalFunc<String>{
    
        @Override
        public String exec(Tuple a) throws IOException {
            // TODO Auto-generated method stub
            if(a == null || a.size() == 0){
                return null;
            }
            try{
                Object object = a.get(0);
                if(object == null){
                    return null;
                }
                int i = (Integer) object;
                if(i >= 10 && i <= 20 ){
                    return "10-20";
                }
                else if (i >= 21 && i <= 30){
                    return "20-30";
                }
                else 
                    return ">30";
            } catch (ExecException e){
                throw new IOException(e);
            }
        }
    
    }
    

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

    REGISTER <path of your .jar file>
    

    用包和类定义它。

    DEFINE U com.Age();
    
    a = LOAD '<input path>' using PigStorage(',') as (id:int,name:chararray,age:int);
    
    b = FOREACH a GENERATE id,name,age,U(age);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-07-24
      • 1970-01-01
      • 2018-07-19
      • 2019-08-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多