前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Hive之UDFs(User-Defined Functions )

Hive之UDFs(User-Defined Functions )

作者头像
王小雷
发布2019-05-26 21:35:52
3.8K0
发布2019-05-26 21:35:52
举报
文章被收录于专栏:王小雷王小雷

版权声明:本文为王小雷原创文章,未经博主允许不得转载

1.Hive之UDFs(User-Defined Functions )

1.1 Hive UDFs (User Defined Functions) 可以在SQL处理比较繁琐或者无法胜任时,解决比较复杂数据处理手段。

1.2 Hive的功能函数有哪些?

  • 内置操作(UDO)
  • 内置功能(UDF)
  • 内置聚合功能(UDAF)
  • 内置的表-生成功能(UDTF)
  • 自定义UDFs(本次主要是讲解自定义UDF)

2.为什么使用UDFs

2.1 当内置函数功能不足时使用

  • e.g. window 忽略了 null – Hive 不支持
  • e.g. 日期格式化功能 – Hive 1.2 才有更好的支持

2.2 当非过程性SQL无法完成任务时使用

  • e.g. 重复数据消除多对多时间序列配对 A->B 10AM, A->C 11AM(消除), D->B 11AM(消除), D->C 11AM, E->C 12PM(消除)

3. 创建、删除、重载功能函数

3.1 创建临时功能函数

代码语言:javascript
复制
CREATE TEMPORARY FUNCTION function_name AS class_name;

3.2 删除临时功能函数

代码语言:javascript
复制
DROP TEMPORARY FUNCTION [IF EXISTS] function_name;

4. 永久功能函数

4.1 创建功能函数

在hive0.13之后可以将功能函数注册到元数据中,无需每次创建session重新创建临时功能函数。

代码语言:javascript
复制
CREATE FUNCTION [db_name.]function_name AS class_name
  [USING JAR|FILE|ARCHIVE 'file_uri' [, JAR|FILE|ARCHIVE 'file_uri'] ];

4.2 删除功能函数

代码语言:javascript
复制
DROP FUNCTION [IF EXISTS] function_name;

4.3 重载功能函数

代码语言:javascript
复制
RELOAD FUNCTION;

4.4 显示已定义的功能函数

代码语言:javascript
复制
SHOW FUNCTIONS "a.*";

5.自定义UDF

5.1 Java实例(MD5)

代码语言:javascript
复制
import com.google.common.hash.Hashing;
import org.apache.hadoop.hive.ql.exec.UDF;

public class Text2md5 extends UDF {
    public String evaluate(final String s) {
        if (s == null) { return null; }

        return Hashing.md5().hashUnencodedChars(s.trim()).toString();
    }

}

5.2 把class文件注册到临时功能函数

代码语言:javascript
复制
create temporary function tmp_md5 as 'com.example.hive.udf.Text2md5';

5.3 把class文件注册到永久功能函数(hive0.13之后)

代码语言:javascript
复制
create function test_hive.tmp_md5 as 'com.example.hive.udf.Text2md5';

5.4 (hive 0.13之前)加载自定义UDF Jar并注册创建UDF

指定jar路径

代码语言:javascript
复制
hive>add jar /home/acm/jar/demo-1.0.jar;

查看jar

代码语言:javascript
复制
hive>list jars

创建函数

代码语言:javascript
复制
CREATE TEMPORARY FUNCTION test_hive.tmp_md5 as 'com.example.hive.udf.Text2md5';

hive local模式可以直接在本地文件使用。 hive no-local 模式时,先将jar上传至HDFS后再使用。

5.5 (hive 0.13之后)UDF在创建函数语句时可以直接指定依赖的jar。

代码语言:javascript
复制
CREATE  TEMPORARY FUNCTION test_hive.test_md5 AS 'com.demo.hive.Text2md5' USING JAR 'hdfs:///tmp/test2/demo-1.0.jar';

(TEMPORARY为临时函数,关闭失去hive连接后临时函数自动去除;不带TEMPORARY则为注册永久函数)

5.6 查看功能函数

代码语言:javascript
复制
SHOW FUNCTIONS 'tes.*';

5.7 使用已注册的UDF

代码语言:javascript
复制
USE test_hive;

select id,test_hive.test_md5(name) from test limit 5;

5.8 问题以及解决方案

问题:创建udf CREATE FUNCTION my_testmd5 AS ‘com.demo.hive.Text2md5’ USING JAR ‘/home/acm/jar/demo-1.0.jar’;

报错:FAILED: Execution Error, return code 1 from org.apache.hadoop.hive.ql.exec.FunctionTask. Hive warehouse is non-local, but /home/acm/jar/demo-1.0.jar specifies file on local filesystem. Resources on non-local warehouse should specify a non-local scheme/path

先将jar上传到hdfs hadoop fs -copyFromLocal 本地jar 目标jar

问题:udf无法使用 Caused by: java.lang.NoSuchMethodError: com.google.common.hash.HashFunction.hashUnencodedChars(Ljava/lang/CharSequence;)Lcom/google/common/hash/HashCode; at com.demo.hive.Text2md5.evaluate(Text2md5.java:18) … 23 more

问题:执行权限不足 FAILED: Execution Error, return code 1 from org.apache.hadoop.hive.ql.exec.mr.MapRedTask. Permission denied: user=root, access=WRITE, inode="/user":hdfs:supergroup:drwxr-xr-x

解决:换hive用户

问题:FAILED: SemanticException Temporary function cannot be created with a qualified name. CREATE TEMPORARY FUNCTION test_hive.t_md52 AS ‘com.demo.hive.Text2md5’ USING JAR ‘hdfs:///tmp/test-h/demo-1.0.jar’;

解决:CREATE TEMPORARY FUNCTION test_hive.t_md52 AS ‘com.demo.hive.Text2md5’ USING JAR ‘hdfs:///tmp/test-h/demo-1.0.jar’; 去掉 test_hive.

问题:/home/acm/jar/demo-1.0.jar does not exist FAILED: Execution Error, return code -101 from org.apache.hadoop.hive.ql.exec.FunctionTask. /home/acm/jar/demo-1.0.jar does not exist 解决:上穿到hdfs上

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2019年03月22日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1.Hive之UDFs(User-Defined Functions )
    • 1.1 Hive UDFs (User Defined Functions) 可以在SQL处理比较繁琐或者无法胜任时,解决比较复杂数据处理手段。
      • 1.2 Hive的功能函数有哪些?
      • 2.为什么使用UDFs
        • 2.1 当内置函数功能不足时使用
          • 2.2 当非过程性SQL无法完成任务时使用
          • 3. 创建、删除、重载功能函数
            • 3.1 创建临时功能函数
              • 3.2 删除临时功能函数
              • 4. 永久功能函数
                • 4.1 创建功能函数
                  • 4.2 删除功能函数
                    • 4.3 重载功能函数
                      • 4.4 显示已定义的功能函数
                      • 5.自定义UDF
                        • 5.1 Java实例(MD5)
                          • 5.2 把class文件注册到临时功能函数
                            • 5.3 把class文件注册到永久功能函数(hive0.13之后)
                              • 5.4 (hive 0.13之前)加载自定义UDF Jar并注册创建UDF
                                • 5.5 (hive 0.13之后)UDF在创建函数语句时可以直接指定依赖的jar。
                                  • 5.6 查看功能函数
                                    • 5.7 使用已注册的UDF
                                      • 5.8 问题以及解决方案
                                      相关产品与服务
                                      大数据
                                      全栈大数据产品,面向海量数据场景,帮助您 “智理无数,心中有数”!
                                      领券
                                      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档