`
weitao1026
  • 浏览: 1048918 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论
阅读更多

Pig的EvalFunc UDF函数,结果一执行,发现返回值,总是bag类型,我就纳闷了,我明明指定了返回是String类型,怎么会变成Bag类型呢?经查找,发现拷贝的问题,由于先前写的UDF函数,返回值是多个,而现在的这个是一个,所以导致,我在pig脚本里面,进行强转string类型出错,发现问题后,设置返回类型为DataType.CHARARRAY问题得以解决。
案例(一),输入值为多个参数,返回也为多个参数 

Java代码
  1. package com.easy.pig;  
  2.   
  3. import com.easy.similar.model.ResultModel;  
  4. import com.easy.similar.tools.TextBuildID;  
  5. import org.apache.pig.EvalFunc;  
  6. import org.apache.pig.data.*;  
  7. import org.apache.pig.impl.logicalLayer.schema.Schema;  
  8.   
  9. import java.io.IOException;  
  10.   
  11. /** 
  12.  * Created by qindongliang on 2015/9/29. 
  13.  * 根据一篇内容返回md5和关键词words 
  14.  */  
  15. public class FingerUDF  extends EvalFunc<DataBag>  {  
  16.   
  17.   
  18.     /**tuple实例**/  
  19.     TupleFactory mTupleFactory = TupleFactory.getInstance();  
  20.     /**Bag实例*/  
  21.     BagFactory mBagFactory = BagFactory.getInstance();  
  22.   
  23.     /**md5构建**/  
  24.      TextBuildID textBuildID = new TextBuildID();  
  25.   
  26.   
  27.   
  28.   
  29.   
  30.     @Override  
  31.     public DataBag exec(Tuple tuple) throws IOException {  
  32.         try {  
  33.             DataBag output = mBagFactory.newDefaultBag();  
  34.             Object o = tuple.get(0);  
  35.             //返回多少句子  
  36.             int num_sentence = Integer.parseInt(tuple.get(1).toString());  
  37.             //返回几个关键词  
  38.             int num_words = Integer.parseInt(tuple.get(2).toString());  
  39.             //使用指纹算法 1  还是分词算法 2  
  40.             int type=Integer.parseInt(tuple.get(3).toString());  
  41.             //参与扩展计算的指纹,null的直接返回空  
  42.             String ext=tuple.get(4)==null?"":tuple.get(4).toString();  
  43.             //设置句子数量  
  44.             textBuildID.top_N_Sentence=num_sentence;  
  45.             //设置返回指纹数量  
  46.             textBuildID.top_N_Words=num_words;  
  47.             //设置去重算法类型  
  48.             textBuildID.type=type;  
  49.             ResultModel ro=textBuildID.buildID(o.toString(),ext);  
  50.             output.add(mTupleFactory.newTuple(ro.getMd5()));//获取md5值  
  51.             output.add(mTupleFactory.newTuple(ro.getWords()));//获取指纹关键词  
  52.             return output;  
  53.         } catch (Exception ee) {  
  54.             // error handling goes here  
  55.             ee.printStackTrace();  
  56.         }  
  57.   
  58.   
  59.         return null;  
  60.     }  
  61.   
  62.   
  63.     /**描述scheaml形式*/  
  64.     public Schema outputSchema(Schema input) {  
  65.         try{  
  66.             Schema bagSchema = new Schema();  
  67.             bagSchema.add(new Schema.FieldSchema("token", DataType.CHARARRAY));  
  68.   
  69.             return new Schema(new Schema.FieldSchema(getSchemaName(this.getClass().getName().toLowerCase(), input),  
  70.                     bagSchema, DataType.BAG));  
  71.         }catch (Exception e){  
  72.             return null;  
  73.         }  
  74.     }  
  75.   
  76.   
  77. }  
package com.easy.pig;

import com.easy.similar.model.ResultModel;
import com.easy.similar.tools.TextBuildID;
import org.apache.pig.EvalFunc;
import org.apache.pig.data.*;
import org.apache.pig.impl.logicalLayer.schema.Schema;

import java.io.IOException;

/**
 * Created by qindongliang on 2015/9/29.
 * 根据一篇内容返回md5和关键词words
 */
public class FingerUDF  extends EvalFunc<DataBag>  {


    /**tuple实例**/
    TupleFactory mTupleFactory = TupleFactory.getInstance();
    /**Bag实例*/
    BagFactory mBagFactory = BagFactory.getInstance();

    /**md5构建**/
     TextBuildID textBuildID = new TextBuildID();





    @Override
    public DataBag exec(Tuple tuple) throws IOException {
        try {
            DataBag output = mBagFactory.newDefaultBag();
            Object o = tuple.get(0);
            //返回多少句子
            int num_sentence = Integer.parseInt(tuple.get(1).toString());
            //返回几个关键词
            int num_words = Integer.parseInt(tuple.get(2).toString());
            //使用指纹算法 1  还是分词算法 2
            int type=Integer.parseInt(tuple.get(3).toString());
            //参与扩展计算的指纹,null的直接返回空
            String ext=tuple.get(4)==null?"":tuple.get(4).toString();
            //设置句子数量
            textBuildID.top_N_Sentence=num_sentence;
            //设置返回指纹数量
            textBuildID.top_N_Words=num_words;
            //设置去重算法类型
            textBuildID.type=type;
            ResultModel ro=textBuildID.buildID(o.toString(),ext);
            output.add(mTupleFactory.newTuple(ro.getMd5()));//获取md5值
            output.add(mTupleFactory.newTuple(ro.getWords()));//获取指纹关键词
            return output;
        } catch (Exception ee) {
            // error handling goes here
            ee.printStackTrace();
        }


        return null;
    }


    /**描述scheaml形式*/
    public Schema outputSchema(Schema input) {
        try{
            Schema bagSchema = new Schema();
            bagSchema.add(new Schema.FieldSchema("token", DataType.CHARARRAY));

            return new Schema(new Schema.FieldSchema(getSchemaName(this.getClass().getName().toLowerCase(), input),
                    bagSchema, DataType.BAG));
        }catch (Exception e){
            return null;
        }
    }


}



案例(二),输入值为String,返回也为String

Java代码 复制代码 收藏代码
  1. package com.easy.pig;  
  2.   
  3. import org.apache.pig.EvalFunc;  
  4. import org.apache.pig.data.DataType;  
  5. import org.apache.pig.data.Tuple;  
  6. import org.apache.pig.impl.logicalLayer.schema.Schema;  
  7.   
  8. import java.io.IOException;  
  9.   
  10. /** 
  11.  *  处理url 
  12.  */  
  13. public class UrlCvUDF extends EvalFunc<String>  {  
  14.   
  15.   
  16.     @Override  
  17.     public String exec(Tuple tuple) throws IOException {  
  18.         try {  
  19.   
  20.             Object o = tuple.get(0);  
  21.             if(o!=null){  
  22.                 //判断是否为指定url开头的来源  
  23.                 if((o+"").startsWith("http://www.court.gov.cn")){  
  24.                     return "1";  
  25.                 }else{  
  26.                     return "2";  
  27.                 }  
  28.             }  
  29.         } catch (Exception ee) {  
  30.             ee.printStackTrace();  
  31.         }  
  32.         //url 为null 则返回0  
  33.         return "0";  
  34.     }  
  35.   
  36. //  
  37.     /**描述scheaml形式*/  
  38.     public Schema outputSchema(Schema input) {  
  39.         try{  
  40.             Schema bagSchema = new Schema();  
  41.             bagSchema.add(new Schema.FieldSchema("token", DataType.CHARARRAY));  
  42.             //注意此处返回值要与泛型里面的对应  
  43.             return new Schema(new Schema.FieldSchema(getSchemaName(this.getClass().getName().toLowerCase(), input),  
  44.                     bagSchema, DataType.CHARARRAY));  
  45.         }catch (Exception e){  
  46.             e.printStackTrace();  
  47.             return null;  
  48.         }  
  49.     }  
  50.   
  51.   
  52. }  
package com.easy.pig;

import org.apache.pig.EvalFunc;
import org.apache.pig.data.DataType;
import org.apache.pig.data.Tuple;
import org.apache.pig.impl.logicalLayer.schema.Schema;

import java.io.IOException;

/**
 *  处理url
 */
public class UrlCvUDF extends EvalFunc<String>  {


    @Override
    public String exec(Tuple tuple) throws IOException {
        try {

            Object o = tuple.get(0);
            if(o!=null){
                //判断是否为指定url开头的来源
                if((o+"").startsWith("http://www.court.gov.cn")){
                    return "1";
                }else{
                    return "2";
                }
            }
        } catch (Exception ee) {
            ee.printStackTrace();
        }
        //url 为null 则返回0
        return "0";
    }

//
    /**描述scheaml形式*/
    public Schema outputSchema(Schema input) {
        try{
            Schema bagSchema = new Schema();
            bagSchema.add(new Schema.FieldSchema("token", DataType.CHARARRAY));
            //注意此处返回值要与泛型里面的对应
            return new Schema(new Schema.FieldSchema(getSchemaName(this.getClass().getName().toLowerCase(), input),
                    bagSchema, DataType.CHARARRAY));
        }catch (Exception e){
            e.printStackTrace();
            return null;
        }
    }


}




案例一的pig脚本:

Java代码 复制代码 收藏代码
  1. --SET debug 'on'  
  2.   
  3. --REGISTER ./aa.jar  
  4. REGISTER ./udf-pig-similarty-hbase-1.0-SNAPSHOT-jar-with-dependencies.jar  
  5. REGISTER ./pig-udf-extend-1.0.1-SNAPSHOT-jar-with-dependencies.jar  
  6.   
  7. --mkdir /user/webmaster/crawldb/finger/  
  8. --rmf /user/webmaster/crawldb/finger/  
  9.   
  10. mkdir /user/webmaster/search/monitor/finger-data;  
  11. rmf  /user/webmaster/search/monitor/finger-data;  
  12.   
  13.   
  14.   
  15. set job.name 'pig-hbase-build-index'  
  16.   
  17.   
  18. a = load 'hbase://ETLDB' USING org.apache.pig.backend.hadoop.hbase.HBaseStorage('content:conn content:casenum,meta:isdelete','-loadKey true  ');  
  19.   
  20. --a = foreach a generate FLATTEN(com.easy.pig.FingerUDF((chararray)$1));  
  21. -- 4个参数  0:文章内容   1:前n最长的句子数,2:前n关键词,3:判重算法, 1=>指纹 2=>分词  
  22. a = foreach a generate $0 as rowkey:chararray , BagToString(com.easy.pig.FingerUDF((chararray)$1,5,8,1,$2),'@') as info:chararray,$2 as casenum:chararray , $3 as isdel:chararray ;  
  23. --a = foreach a generate $2 as num:chararray;  
  24.   
  25. --a = limit a 50;  
  26.   
  27. --dump a;  
  28. --describe a;  
  29. a = foreach a generate $0 as rowkey:chararray , STRSPLIT(info,'@',2).$0 as finger_md5:chararray ,STRSPLIT(info,'@',2).$1 as finger_content:chararray ,casenum,isdel ;  
  30.   
  31. --describe a;  
  32.   
  33. store a into  '/user/webmaster/search/monitor/finger-data'  using com.pig.support.lucene.LuceneStore('row:true:false,finger_md5:true:false,finger_content:true:false,casenum:true:false,isdel:true:false','default');  
--SET debug 'on'

--REGISTER ./aa.jar
REGISTER ./udf-pig-similarty-hbase-1.0-SNAPSHOT-jar-with-dependencies.jar
REGISTER ./pig-udf-extend-1.0.1-SNAPSHOT-jar-with-dependencies.jar

--mkdir /user/webmaster/crawldb/finger/
--rmf /user/webmaster/crawldb/finger/

mkdir /user/webmaster/search/monitor/finger-data;
rmf  /user/webmaster/search/monitor/finger-data;



set job.name 'pig-hbase-build-index'


a = load 'hbase://ETLDB' USING org.apache.pig.backend.hadoop.hbase.HBaseStorage('content:conn content:casenum,meta:isdelete','-loadKey true  ');

--a = foreach a generate FLATTEN(com.easy.pig.FingerUDF((chararray)$1));
-- 4个参数  0:文章内容   1:前n最长的句子数,2:前n关键词,3:判重算法, 1=>指纹 2=>分词
a = foreach a generate $0 as rowkey:chararray , BagToString(com.easy.pig.FingerUDF((chararray)$1,5,8,1,$2),'@') as info:chararray,$2 as casenum:chararray , $3 as isdel:chararray ;
--a = foreach a generate $2 as num:chararray;

--a = limit a 50;

--dump a;
--describe a;
a = foreach a generate $0 as rowkey:chararray , STRSPLIT(info,'@',2).$0 as finger_md5:chararray ,STRSPLIT(info,'@',2).$1 as finger_content:chararray ,casenum,isdel ;

--describe a;

store a into  '/user/webmaster/search/monitor/finger-data'  using com.pig.support.lucene.LuceneStore('row:true:false,finger_md5:true:false,finger_content:true:false,casenum:true:false,isdel:true:false','default');




案例二的pig脚本:


Java代码 复制代码 收藏代码
  1. --SET debug 'on'  
  2.   
  3. --REGISTER ./aa.jar  
  4. REGISTER ./udf-pig-similarty-hbase-1.0-SNAPSHOT-jar-with-dependencies.jar  
  5. REGISTER ./pig-udf-extend-1.0.1-SNAPSHOT-jar-with-dependencies.jar  
  6.   
  7. --mkdir /user/webmaster/crawldb/finger/  
  8. --rmf /user/webmaster/crawldb/finger/  
  9.   
  10. mkdir /user/webmaster/search/monitor/finger-data;  
  11. rmf  /user/webmaster/search/monitor/finger-data;  
  12.   
  13.   
  14.   
  15. set job.name 'pig-hbase-build-index'  
  16.   
  17.   
  18. a = load 'hbase://ETLDB' USING org.apache.pig.backend.hadoop.hbase.HBaseStorage('content:conn content:casenum meta:isdelete content:url','-loadKey true  ');  
  19.   
  20. --a = foreach a generate FLATTEN(com.easy.pig.FingerUDF((chararray)$1));  
  21. -- 4个参数  0:文章内容   1:前n最长的句子数,2:前n关键词,3:判重算法, 1=>指纹 2=>分词  
  22. a = foreach a generate $0 as rowkey:chararray , BagToString(com.easy.pig.FingerUDF((chararray)$1,5,8,1,''),'@') as info:chararray,$2 as casenum:chararray , $3 as isdel:chararray,   com.easy.pig.UrlCvUDF((chararray)$4)  as source:chararray   ;  
  23. --a = foreach a generate $2 as num:chararray;  
  24.   
  25.   
  26. a = limit a 11;  
  27.   
  28. dump a;  
  29. describe a;  
  30. --describe a;  
  31. --a = foreach a generate $0 as rowkey:chararray , STRSPLIT(info,'@',2).$0 as finger_md5:chararray ,STRSPLIT(info,'@',2).$1 as finger_content:chararray ,casenum,isdel ;  
  32.   
  33. --describe a;  
  34.   
  35. --store a into  '/user/webmaster/search/monitor/finger-data'  using com.pig.support.lucene.LuceneStore('row:true:false,finger_md5:true:false,finger_content:true:false,casenum:true:false,isdel:true:false','default'); 
分享到:
评论

相关推荐

    pig udf 函数(urldecode row_number tomap)

    用户定义的函数(User Defined Functions, UDFs)是 Pig 功能的重要组成部分,允许用户扩展其内在功能以满足特定需求。在这个主题中,我们将深入探讨 `urldecode`、`row_number` 和 `tomap` 这三个 UDF 在 Pig 中的...

    大数据 java hive udf函数的示例代码(手机号码脱敏)

    "大数据 Java Hive UDF 函数示例代码(手机号码脱敏)" 大数据 Java Hive UDF 函数示例代码(手机号码脱敏)是指使用 Java 语言开发的用户定义函数(User Defined Function,UDF),该函数可以在 Hive 中使用,实现...

    hive自定义UDF编写函数.docx

    Hive 自定义 UDF 编写函数 本文主要讲解了 Hive 中自定义 UDF 函数的编写方法,包括创建 UDF 类、实现自定义函数逻辑、编译和打包 UDF jar 包、上传至 Hive 服务器并注册自定义函数。 一、创建 UDF 类 为了实现...

    impala自定义日期处理的udf函数

    由于impala处理日期的函数如date_sub(),date_trunc(),last_day()等这些日期处理函数还需要进行日期格式化为yyyy-MM-dd使用,sql代码段过长,导致频繁嵌套过于复杂.所以自定义udf函数解决这些问题.以下为实现过程.

    * hive脱敏UDF函数 *对一些敏感信息进行脱敏处理,替换位置可自定义,脱敏符号可随机也可自定义

    * 脱敏UDF函数 * 功能:对一些敏感信息进行脱敏处理,替换方式可选择自定义替换,如'#','*'等,,如不指定脱敏符号,使用个随机字符替换 * 脱敏位置可自定义,不指定位置,会对数据进行全脱敏 * 例如身份证信息: ...

    phoenix-udf自定义函数测试jar包

    phoenix-udf自定义函数,上传到hdfs的lib目录,测试udf自定义函数功能,有需要可以下载;select QUARTER(birth) from person

    旅游集市数仓建设可能用到的UDF函数

    在旅游集市数仓建设中,可能会用到各种UDF(User Defined Function,用户自定义函数)来处理和分析数据。这些UDF函数可以根据具体的需求和业务场景来设计和实现。以提高数据处理的效率和灵活性。以下是一些在旅游...

    一些有用的自定义配置单元udf函数、特殊数组、json、数学、字符串函数。___下载.zip

    "一些有用的自定义配置单元udf函数、特殊数组、json、数学、字符串函数。___下载.zip" 提供的资源显然是关于Hive的自定义用户定义函数(UDF)和一些实用的函数库,这对于优化Hive查询和处理复杂的数据操作至关重要。...

    Maxcompute UDF函手动打包以及注册.doc

    在大数据处理中,Maxcompute UDF 函数是非常重要的一部分,它能够帮助开发者扩展Maxcompute的计算能力。然而,在使用Maxcompute UDF 函数时,开发者需要将其打包并注册到Maxcompute平台上。本文档将详细介绍...

    AES解密UDF函数.doc

    ### AES解密UDF函数详解 #### 一、概述 在大数据处理领域,尤其是在Hadoop生态体系中的数据处理环节,用户定义的函数(User Defined Function, UDF)扮演着非常重要的角色。它允许开发人员根据特定需求编写自定义...

    java RSA加解密的udf函数

    RSAUdf.java可能包含了自定义的用户定义函数(UDF),这些函数用于执行RSA加解密操作。而KeyRSA.java可能包含了生成和管理RSA密钥对的代码。 在RSAUdf.java中,常见的方法可能有`encrypt()`和`decrypt()`。`encrypt...

    获取规范薪酬UDF函数.doc

    ### 获取规范薪酬UDF函数详解 #### UDF概述与应用场景 在大数据处理中,用户定义的函数(User Defined Function,简称UDF)是Hive SQL的一种扩展机制,它允许开发人员自定义函数来处理特定的数据处理需求。对于...

    各种情况手机号清洗udf函数(hive impala)

    本文将详细讲解如何通过自定义函数(UDF)来处理各种格式的手机号码,确保数据的质量和一致性。我们将涵盖正则表达式在手机号码清洗中的应用,以及如何编写和使用Java UDF在Hive和Impala中实现这个过程。 1. **手机...

    Hive的Udf函数进行数据脱敏

    在Hive中,UDF分为三种类型:UDF(单行函数)、UDAF(累积聚合函数)和UDTF(多行转换函数)。在这里,我们只需要UDF,因为它适用于处理单行数据。 1. **编写Java类**: 要创建一个UDF,你需要编写一个Java类,该...

    hive UDF需要jar包

    在Hive中,UDF(User Defined Functions)是用户自定义函数,允许开发人员扩展Hive的内置功能,以满足特定的数据处理需求。Hive UDF的实现通常涉及到编写Java代码,并将其打包成JAR(Java Archive)文件,然后在Hive...

    hive自定义udf函数实战

    udf函数,用户自定义函数,可以直接在sql语句中计算的函数 优点: 允许实现模块化的程序设计、方便修改代码、增加函数 UDF的执行速度很快,通过缓存计划在语句重复执行时降低代码的编译开销,比存储方法的执行效率...

    获取最大分区UDF函数.doc

    ### 获取最大分区UDF函数详解 #### UDF概述与应用场景 在大数据处理中,特别是使用Hive进行数据仓库构建时,经常会遇到需要根据特定条件筛选数据的情况,比如找到某个表的最大分区来确保查询数据是最新的或者最...

    HIVE自定义UDF函数

    而自定义用户定义函数(UDF)是 Hive 中的一个重要功能,允许用户根据自己的需求编写自定义函数,以便在 Hive 查询中使用。 如何在 Hive 中创建自定义 UDF 函数: 步骤一:编写 Java 程序 首先,您需要编写一个 ...

    实时计算udf函数倒序

    实时计算udf函数倒序

    获取规范货币类型UDF函数.doc

    ### 获取规范货币类型UDF函数 #### 概述 在大数据处理领域,特别是金融数据分析场景中,经常需要对数据进行标准化处理。对于货币类型的规范化处理是常见需求之一。本篇文章将详细介绍如何创建一个Hive UDF(User ...

Global site tag (gtag.js) - Google Analytics