Hive系列(六)Hive内置函数与自定义函数(总结)--自从有了UDF--我:就这??

Hive函数:

Hive函数分类:

从输入输出角度分类:
  • 标准函数
  • 聚合函数
  • 表生成函数
从实现方式分类:
  • 内置函数:
  • 自定义函数:
    • UDF
    • UDAF
    • UDTF

Hive内置函数:

  • 标准函数:

    • 字符函数:

在这里插入图片描述

  • 类型转换函数:

    返回值类型转换函数描述
    "type"cast(expr as )将expr转换成type类型 如:cast(“1” as BIGINT) 将字符串1转换成了BIGINT类型
    binarybinary(string|binary)将输入的值转换成二进制
  • 数学函数:

在这里插入图片描述

  • 日期函数:
    在这里插入图片描述

  • 集合函数:

    返回值函数描述
    intsize(Map<K.V>)返回map中键值对个数
    intsize(Array)返回数组的长度
    arraymap_keys(Map<K.V>)返回map中的所有key
    arraymap_values(Map<K.V>)返回map中的所有value
    booleanarray_contains(Array, value)如该数组Array包含value返回true。,否则返回false
    arraysort_array(Array)对数组进行排序
  • 条件函数:

    返回值函数描述
    Tif(boolean testCondition, T valueTrue, T valueFalseOrNull)如果testCondition 为true就返回valueTrue,否则返回valueFalseOrNull
    Tnvl(T value, T default_value)value为NULL返回default_value,否则返回value
    TCOALESCE(T v1, T v2, …)返回第一非null的值,如果全部都为NULL就返回NULL
    TCASE a WHEN b THEN c [WHEN d THEN e] [ELSE f] END*如果a=b就返回c,a=d就返回e,否则返回f
    TCASE WHEN a THEN b [WHEN c THEN d] [ELSE e] END*如果a=ture就返回b,c= ture就返回d,否则返回e
    booleanisnull( a )如果a为null就返回true,否则返回false
    booleanisnotnull ( a )如果a为非null就返回true,否则返回false
  • 聚合函数:

  • 表生成函数:

    返回值函数描述
    N rowsexplode(array)对于array中的每个元素生成一行且包含该元素
    N rowsexplode(MAP)每行对应每个map键值对 其中一个字段是map的键,另一个字段是map的值
    N rowsposexplode(ARRAY)与explode类似,不同的是还返回各元素在数组中的位置
    N rowsstack(INT n, v_1, v_2, …, v_k)把k列转换成n行,每行有k/n个字段,其中n必须是常数
    tuplejson_tuple(jsonStr, k1, k2, …)从一个JSON字符串中获取多个键并作为一个元组返回,与get_json_object不同的是此函数能一次获取多个键值

Hive的UDF:-user-defined function

JAVA操作过程:

UDF开发流程

  • 继承UDF类或GenericUDF类

  • 重写evaluate()方法并实现函数逻辑

  • 编译打包为jar文件

  • 复制到正确的HDFS 路径

  • 使用jar创建临时/永久函数

    • 临时函数
      -- 临时函数仅对当前session(黑窗口)有效。 
      -- 添加jar包的两种方法 :
        	    临时加入jar包的命令
                方法一: add jar /home/hadoop/lib/hive-1.0-SNAPSHOT.jar; 
                方法二: 在hive的文件夹下面创建auxlib文件夹,将jar包上传到auxlib文件夹下面,重启hive。 
    
    语法:
    	CREATE TEMPORARY FUNCTION function_name AS class_name;   
    -- function_name函数名
    -- class_name 类路径,包名+类名 
    
    • 永久函数—必须上传到HDFS上,hive是基于hadoop的
    --创建永久函数的语法: 
                CREATE FUNCTION [db_name.]function_name AS class_name 
                [using jar +FILE|ARCHIVE 'file_uri' [, JAR|FILE|ARCHIVE 'file_uri'] ]; 
    --# file_uri:是hdfs上的jar包目录 
    --添加jar包的两种方法: 
                -- hdfs上的根目录下创建lib文件夹  
                [hadoop@hadoop002 lib]$ hadoop fs -mkdir /lib  
    
    --创建永久函数:  
                hive> CREATE FUNCTION sayhello AS 'com.ruozedata.bigdata.HelloUDF' USING JAR 'hdfs://hadoop002:9000/lib/hive-1.0-SNAPSHOT.jar'; 
                converting to local hdfs://hadoop002:9000/lib/hive-1.0-SNAPSHOT.jar 
                Added [/tmp/22d50f26-5227-479e-9319-cb28985b8f5d_resources/hive-1.0-SNAPSHOT.jar] to class path 
                Added resources: [hdfs://hadoop002:9000/lib/hive-1.0-SNAPSHOT.jar] 
    
  • 调用函数

HiveUDAF:用户自定义聚合函数:-user-defined aggregate function

JAVA操作过程:

HiveUDTF:用户自定义表生成函数:-user-defined aggregate function

JAVA操作过程:
  • 写出函数继承GenericUDTF类,完成–输入一行–输出多行–的功能

  • initialize来确定列名,列数量和列类型。

    @Override
    	public StructObjectInspector initialize(StructObjectInspector argOIs) throws UDFArgumentException {
    		// 设置新列名和列数量
    		List<String> column = new ArrayList<>();
    		column.add("like1");
    		// 设置每列的列类型
    		List<ObjectInspector> columnsType = new ArrayList<>();
    		columnsType.add(PrimitiveObjectInspectorFactory.javaStringObjectInspector);
    		return ObjectInspectorFactory.getStandardStructObjectInspector(column,columnsType);
    	}
    
  • process来处理将一列拆成多列或者多行,形成临时表格

    	@Override
    	public void process(Object[] objects) throws HiveException {
    		// 将一列拆成两列  摔回去objects第一个数值是列值,object其他参数是该列的其他参数
    		String [] res = objects[0].toString().split(",");
    		for (String re : res) {
    			forward(new Object[]{re});
    		}
    	}
    

ps:以后我们可以让一列的奇葩数据在java底层割成多个数组,慢慢匹配

例:zs.23;play,sleep friend

  • close关闭
	@Override
	public void close() throws HiveException {}

explode是特殊的UDTF函数,一列拆多行

使用UDTF甚至可以做到一列拆多列 | 一列拆多行 | 一列拆多列多行


UDF | UDAF | UDTF 区别:

UDF:返回对应值,一对一

UDAF:返回聚类值,多对一

UDTF:返回拆分值,一对多

Hive宏函数:

由于UDF是Java编写的,代码中堆变量的内存回收完全不受开发者控制,而UDF程序又是嵌套在Hive SQL中执行的,对规模较大的表,就往往会出现由于UDF内存回收不及时造成的out-of-memory错误。因此,在生产环境中,UDF是严格受限的

大多数不需要循环结构的逻辑,基本上都可以用宏来处理

创建宏函数:
create temporary macro macro_name([col_name col_type, ...])
expression;
宏的局限性:
  • 宏只能是临时宏,只在本次会话中可见、有效
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值