zoukankan      html  css  js  c++  java
  • Pig UDF 用户自定义函数

    注册UDF

    do.pig的内容如下:
    register /xx/yy.jar
    data = load 'data';
    result = foreach data generate aa.bb.Upper($0);
    dump result;
    

       

    register的路径可以是本地路径,也可以是hdfs路径
    register hdfs://pig/xx/yy.jar
    

       

    如果是pig -Dudf.import.list=aa.bb,在引用UDF时可以不用包路径:
    register /xx/yy.jar
    data = load 'data';
    result = foreach data generate Upper($0);
    dump result;
    

       

    如果是pig -Dpig.additional.jars=/xx/yy.jar,可以不用register:
    data = load 'data';
    result = foreach data generate aa.bb.Upper($0);
    dump result;
    

       

    可以使用define为UDF起别名:
    register /xx/yy.jar
    define UPPER aa.bb. Upper();
    data = load 'data';
    result = foreach data generate UPPER($0);
    dump result;
    

       

    如果构造UDF需要参数,可以在define里传入,也可以define多个重载的构造函数
    register /xx/yy.jar
    define UPPER1 aa.bb. Upper();
    define UPPER2 aa.bb. Upper('abc');
    data = load 'data';
    result = foreach data generate UPPER1($0), UPPER2($1);
    dump result;
    

       

    调用静态java函数
    可调用的函数必须符合条件:
    1)静态函数
    2)参数是基本数据类型、stirng、array
    3)返回值是基本数据类型、string
    多个参数用空格分隔
    InvokeForInt、InvokeForLong、InvokeForFloat、InvokeForDouble、InvokeForString
    define hex InvokeForString('java.lang.Integer.toHexString', 'int');
    data = load 'data';
    result = foreach data generate hex((int)$0);
    

      

    define stdev InvokeForDouble('com.acme.stats.stdev', 'double[]');
    a = load 'data' as (id:int, dp:double);
    b = group a by id;
    c = foreach b generate stdev(a.dp);
    

       


    自定义UDF
    Eval Function (运算函数)
    package com.test.pig.udf;
    import java.io.IOException;
    import org.apache.pig.EvalFunc;
    import org.apache.pig.data.Tuple;
    public class CustomReplaceFunc extends EvalFunc<String> {
    	@Override
    	public String exec(Tuple tuple) throws IOException {
    		if(tuple == null || tuple.size() == 0 || tuple.isNull(0) ) {
    			return null;
    		}
    		
    		String original = (String)tuple.get(0);
    		String oldChar = (String)tuple.get(1);
    		String newChar = (String)tuple.get(2);
    		
    		return original.replaceAll(oldChar, newChar);
    	}
    }
    

      

    register /home/pig/myfunc.jar
    define MyReplace com.test.pig.udf.CustomReplaceFunc();
    users = load '/users.data' as (name:chararray, age, address);
    result = foreach users generate MyReplace(name, 'l', 'L'), age, address;
    dump result;
    

      

    Aggregate Function (聚合函数)
    Filter Function(过滤函数)
    Load Function(加载函数)
    Store Function(存储函数)
     
  • 相关阅读:
    标准粒子群算法(PSO)
    Java开发中的23种设计模式详解
    分布式事务
    sjk 分页
    有用吗2
    有用吗1
    存储过程
    在虚拟机Linux安装Redis
    ajax调用WebAPI添加数据
    SVN安装和使用(简单版)
  • 原文地址:https://www.cnblogs.com/lishouguang/p/4559619.html
Copyright © 2011-2022 走看看