免费注册
帮助文档(华北一、二)

  • 4.1 支持自定义UDF函数

    下面提供2种方式用于编写udf函数,第一种是通过Eclipse,第二种是直接在托管Hadoop集群的master节点上利用shell脚本编译

    在Eclipse中编写自定义Hive udf函数

    1 在eclipse中新建java project: hiveudf;

    2 在hiveudf工作中添加一个文件夹lib,lib包需要拷贝相关jar包,添加完毕后如下图所示:

    这四个包在可在uhadoop-******-master1的以下位置找到:

     
    /home/hadoop/share/hadoop/mapreduce/hadoop-mapreduce-client-core-2.6.0-cdh5.4.9.jar 
    /home/hadoop/share/hadoop/hdfs/hadoop-hdfs-2.6.0-cdh5.4.9.jar 
    /home/hadoop/share/hadoop/common/hadoop-common-2.6.0-cdh5.4.9.jar 
    /home/hadoop/hive/lib/hive-exec-1.2.1.jar

    3 把lib目录下的所有jar包 Add to build Path

    4 创建一个UDFLower 类并且继承hive的UDF类,新建的UDFLower类的package请填空值。

     
    import org.apache.hadoop.hive.ql.exec.UDF;  
    import org.apache.hadoop.io.Text;  
    public class UDFLower extends UDF{       
      public Text evaluate(final Text s){            
        if (null == s){                
          return null;            
        }            
        return new Text(s.toString().toLowerCase());        
      }  
    }

    最终的结构如图所示:

    5 打包UDFLower.jar

    – 执行导出

    – 选择JAR file

    – 修改导出目录名称,并点击Finish,UDFLower.jar便制作完成了。

    – 通过ssh命令上传至hadoop master1节点

    如果master1已绑定外网,可直接通过外网IP上传,如果没有,请通过有外网IP的机器跳转。

    在Linux下编写自定义Hive udf函数

    ● 创建代码

    登录hadoop-******-master1节点,进入/data目录,创建udf代码:

     
    cd /data   
    mkdir hive_udf   
    touch UDFLower.java

    UDFLower.java代码如下:

     
    import org.apache.hadoop.hive.ql.exec.UDF; 
    import org.apache.hadoop.io.Text; 
    public class UDFLower extends UDF{      
      public Text evaluate(final Text s){           
        if (null == s){               
          return null;           
        }           
        return new Text(s.toString().toLowerCase());       
      } 
    }

    ● 同目录下创建编译文件compile.sh

     
    #!/bin/bash 
    rm -f UDFLower.jar 
    rm -f UDFLower*.class 
    export HADOOP_MAPRED_HOME=/home/hadoop 
    CLASSPATH=.:$HIVE_HOME/conf   
    for i in /home/hadoop/share/hadoop/common/*.jar ; do     
      CLASSPATH=$CLASSPATH:$i 
    done  
    for i in /home/hadoop/hive/lib/*.jar ; do     
      CLASSPATH=$CLASSPATH:$i 
    done 
    javac -cp $CLASSPATH UDFLower.java 
    jar cvf UDFLower.jar UDFLower.class

    执行sh compile.sh后将在同目录下产生UDFLower.jar

    利用上述生成的UDFLower.jar进行Hive示例

    ● 进入UDFLower.jar所在目录,上传至HDFS目录

    hadoop fs -put UDFLower.jar /tmp/

    ● 测试数据准备

    测试文件test.txt,内容如下:

     HELLO WORLD HEHE

    上传至HDFS

     hadoop fs -put test.txt /tmp/

    - Hive Cli中创建相关数据表,并load数据

     
    hive> create table test_hive_udf (name string); 
    hive> load data inpath  '/test/1/test.txt' into table test_hive_udf;

    创建temporary function

     hive> create temporary function my_lower as 'UDFLower';

    使用自定义UDF

     
    hive> select name from test_hive_udf; 
    hive> select my_lower(name) from test_hive_udf;

    2 支持json格式数据

    ● 数据准备

    上传数据test.json数据到hdfs

    test.json数据如下:

     {"id":1234544353,"text":"test_hive_json"}

    上传数据到HDFS

     hdfs dfs -put test.json /tmp/test.json

    - 加载依赖包

    hive解析json格式的数据依赖hive-json-serde.jar,如果通过beeline无需再通过add jar加载对应的jar包。如果你使用的hive cli接口需要add jar,做如下操作:

     hive> add jar $HIVE_HOME/lib/hive-json-serde.jar;

    hive1.2.1版本尚未提供此包

    - 创建hive表格

     
    hive> CREATE TABLE test_json(id BIGINT,text STRING)ROW FORMAT SERDE 
    'org.apache.hadoop.hive.contrib.serde2.JsonSerde' STORED AS TEXTFILE;

    ● 加载数据

     hive> LOAD DATA  INPATH "/tmp/test.json" OVERWRITE INTO TABLE test_json;

    ● 执行查询

    返回如下说明使用json文件解析成功

     
    hive> select * from test_json; 
    OK 
    1234544353  test_hive_json

    3 使用正则匹配

    ● 数据准备

    上传测试数据nginx_log到hdfs

    nginx_log数据如下

     180.173.250.74 168.34.34

    上传至HDFS

     hdfs dfs -put nginx_log /tmp/nginx_log

    - 加载依赖包

    hive正则匹配使用依赖hive-contrib.jar,如果通过beeline无需再通过add jar加载对应的jar包。如果你使用的hive cli接口需要add jar,做如下操作:

     hive> add jar $HIVE_HOME/lib/hive-contrib.jar;

    ● 创建测试表格

     
    hive> CREATE TABLE logs(        
      host STRING,        
      identity STRING)          
      ROW FORMAT SERDE 'org.apache.hadoop.hive.contrib.serde2.RegexSerDe'          
      WITH SERDEPROPERTIES (          
      "input.regex" = "([^ ]*) ([^ ]*)",          
      "output.format.string" = "%1$s %2$s" 
    )STORED AS TEXTFILE;

    注解:创建表格的时候需要指定ROW FORMAT SERDE,SERDEPROPERTIES中的 input.regex和output.format.string

    - 加载数据

     hive> LOAD DATA INPATH "/tmp/nginx_log" INTO TABLE logs;

    ● 测试数据

    返回如下说明正则表达式使用成功

     
    hive> select * from logs; 
    OK 
    180.173.250.74  168.34.34

文档是否已解决您的问题?

  已解决   未解决

如您有其它疑问,您也可以与我们技术专家联系探讨。

联系技术专家