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(存储函数)
     
  • 相关阅读:
    [原]JsDoc:JavaScript文档生成工具相关
    [原]代码片段编辑器
    [原]openlayers+ext
    [原]符合W3C标准的类innerText
    [原]关于鼠标滚轮的编程
    [原]IE8中开启IE7的兼容模式
    MAC下安装mysql
    intellij idea 代码正常,但是编译出现 java:需要";"
    eclipse 安装插件不生效
    [转]Linux下修改/设置环境变量JAVA_HOME
  • 原文地址:https://www.cnblogs.com/lishouguang/p/4559619.html
Copyright © 2011-2022 走看看