Hive内置运算函数,自定义函数(UDF)和Transform
4.Hive函数
4.1 内置运算符
内容较多,见《Hive官方文档》
4.2 内置函数
内容较多,见《Hive官方文档》
https://cwiki.apache.org/confluence/display/Hive/LanguageManual+UDF
测试各种内置函数的快捷方法:
1、创建一个dual表
create table dual(id string);
2、load一个文件(一行,一个空格)到dual表
hive> load data local inpath'/home/tuzq/software/hivedata/dual.txt' into table dual;
其中dual.txt里面只是一个空格
3、select substr('angelababy',2,3) from dual;
4.3 Hive自定义函数和Transform
当Hive提供的内置函数无法满足你的业务处理需要时,此时就可以考虑使用用户自定义函数(UDF:user-defined function)。
4.3.1 自定义函数类别
UDF 作用于单个数据行,产生一个数据行作为输出。(数学函数,字符串函数)
UDAF(用户定义聚集函数):接收多个输入数据行,并产生一个输出数据行。(count,max)
4.3.2 UDF开发实例
l 简单UDF示例
前期准备,要把hive的lib包导入到工程中,其中UDF依赖的是hive-exec-1.2.1.jar。也就是说要把apache-hive-1.2.1-bin\lib中内容都引入到工程中。若用到hadoop中的一些api,请把hadoop的api也引入进去。
1、先开发一个java类,继承UDF,并重载evaluate方法
package hiveudf;
import org.apache.hadoop.hive.ql.exec.UDF; import org.apache.hadoop.io.Text;
public class ToLowerCase extends UDF {
public Text evaluate(final Text s) { if(s == null) {returnnull;} returnnew Text(s.toString().toLowerCase()); } } |
2、打成jar包上传到服务器
3、将jar包添加到hive的classpath
4、hive> addJAR /home/tuzq/software/hivedata/udf.jar> ;
Added [/home/tuzq/software/hivedata/udf.jar] to class path
Added resources: [/home/tuzq/software/hivedata/udf.jar]
5、hive>创建临时函数与开发好的java class关联
hive> create temporary function toLowercase as 'hiveudf.ToLowerCase'; OK Time taken: 0.039 seconds hive> |
5、即可在hql中使用自定义的函数tolowercase ip
hive> select toLowercase("TUZUOQUAN") from dual; OK tuzuoquan Time taken: 0.122 seconds, Fetched: 1 row(s) hive> |
l Json数据解析UDF开发
作业:
有原始json数据如下:
{"movie":"1193","rate":"5","timeStamp":"978300760","uid":"1"} {"movie":"661","rate":"3","timeStamp":"978302109","uid":"1"} {"movie":"914","rate":"3","timeStamp":"978301968","uid":"1"} {"movie":"3408","rate":"4","timeStamp":"978300275","uid":"1"} {"movie":"2355","rate":"5","timeStamp":"978824291","uid":"1"} {"movie":"1197","rate":"3","timeStamp":"978302268","uid":"1"} {"movie":"1287","rate":"5","timeStamp":"978302039","uid":"1"} |
需要将数据导入到hive数据仓库中
我不管你中间用几个表,最终我要得到一个结果表:
movie | rate | timestamp | uid |
1197 | 3 | 978302268 | 1 |
注:全在hive中完成,可以用自定义函数
4.3.3 Transform实现
Hive的 TRANSFORM 关键字提供了在SQL中调用自写脚本的功能
适合实现Hive中没有的功能又不想写UDF的情况
使用示例1:下面这句sql就是借用了weekday_mapper.py对数据进行了处理.
CREATE TABLE u_data_new ( movieid INT, rating INT, weekday INT, userid INT) ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t';
add FILE weekday_mapper.py;
INSERT OVERWRITE TABLE u_data_new SELECT TRANSFORM (movieid , rate, timestring,uid) USING 'python weekday_mapper.py' AS (movieid, rating, weekday,userid) FROM t_rating; |
其中weekday_mapper.py内容如下
#!/bin/python import sys import datetime
for line in sys.stdin: line = line.strip() movieid, rating, unixtime,userid = line.split('\t') weekday = datetime.datetime.fromtimestamp(float(unixtime)).isoweekday() print '\t'.join([movieid, rating, str(weekday),userid]) |

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
[Spark]Spark RDD 指南三 弹性分布式数据集(RDD)
Spark2.3.0 版本:Spark2.3.0 创建RDD Spark的核心概念是弹性分布式数据集(RDD),RDD是一个可容错、可并行操作的分布式元素集合。有两种方法可以创建RDD对象: 在驱动程序中并行化操作集合对象来创建RDD 从外部存储系统中引用数据集(如:共享文件系统、HDFS、HBase或者其他Hadoop支持的数据源)。 1. 并行化集合 通过在驱动程序中的现有集合上调用JavaSparkContext的parallelize方法创建并行化集合(Parallelized collections)。集合的元素被复制以形成可以并行操作的分布式数据集。 例如,下面是如何创建一个包含数字1到5的并行化集合: Java版本: List<Integer> list = Arrays.asList(1,2,3,4,5); JavaRDD<Integer> rdd = sc.parallelize(list); Scala版本: val data = Array(1, 2, 3, 4, 5) val distData = sc.parallelize(data)...
- 下一篇
【云周刊】第126期:硬货!云存储成本到底省在哪儿
本期头条 #云存储的成本到底省在哪儿# 终于搞明白,存储TCO原来是这样算的 随着业务的进展到一个新的阶段以及数据量积累到一定程度后,老板开始关注成本。老板一关注成本就开始悄悄的打听各种服务器、硬件啥的价格了,云存储的成本也是难逃的问题。那么云存储的成本到底可以省在哪儿呢?点击查看 【云栖风向标】VOL.4:重磅发布!一文看尽上海云栖大会 阿里云数加产品家族图首次亮相 CCAI 讲师专访 | 机器学习奠基人Thomas Dietterich:人类将如何受到AI威胁 教育部阿里云联合推进云计算人才培养,首批9本教材出版 阿里云发布聆听平台 全球招募300位MVP 他写出了史上最牛高考满分作文,如今在天猫卖小龙虾 阿里云肖力:时间会把一切还给我们 阿里云发布移动数据中心“闪电立方”:为PB级海量数据迁移而生 阿里云总裁胡晓明:保护客户数据隐私是阿里
相关文章
文章评论
共有0条评论来说两句吧...