自定义UDTF函数
概述
用户自定义表生成函数(UDTF)接受零个或多个输入,然后产生多列或多行的输出。要实现UDTF,需要继承org.apache.hadoop.hive.ql.udf.generic.GenericUDTF,同时实现三个方法。
参考文章
https://cwiki.apache.org/confluence/display/Hive/LanguageManual+UDF
https://javinjunfeng.top/technicalstack/hive/77
案例
原始数据和转换后的数据
原始数据:
sku,category_name,busi_time,shop_id,flag,sale_num,income
21A5+32B2,烟灶,2018-06-29 00:00:00,21,0,6,16056.0
转换后的数据:
rela_sku,rule_id,sku,category_name,busi_time,shop_id,sale_num,income
21A5,0,21A5+32B2,烟机,2018-06-29 00:00:00,21,6,16056.0
32B2,1,21A5+32B2,灶具,2018-06-29 00:00:00,21,6,16056.0
创建自定义函数
1 | package com.xh.spark.sql.hive.udtf; |
创建表
1 | create table if not exists transct_quota( |
插入数据
1 | insert into transct_quota values ("21A5+32B2","烟灶","2018-06-29 00:00:00","21","0",6,16056.0); |
在hive命令窗口添加函数jar包
1 | add jar /home/hadoop/sparklearning-1.0-SNAPSHOT.jar; |
在hive命令窗口创建临时函数
1 | create temporary function combine_sku_reduction_rule as 'com.xh.spark.sql.hive.udtf.JDQuotaReduction'; |
使用自定义函数
1 | select c1,c2,jd_quota.* from transct_quota LATERAL VIEW combine_sku_reduction_rule(array(named_struct('sku', goods_sku_id, 'cate', category_name,'flag',flag))) sku_tab as c1,c2; |