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、loa

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])

 

 

 

目录
相关文章
|
2月前
|
SQL HIVE
hive高频函数(一)
hive高频函数(一)
24 0
|
2月前
|
SQL XML JSON
Hive函数全解——思维导图 + 七种函数类型
Hive函数全解——思维导图 + 七种函数类型
50 2
Hive函数全解——思维导图 + 七种函数类型
|
2月前
|
SQL 分布式计算 HIVE
Hive Cli / HiveServer2 中使用 dayofweek 函数引发的BUG!
在Hive 3.1.2和Spark 3.0.2集群环境中,遇到`dayofweek`函数bug。当`create_date`为字符串类型时,`dayofweek`函数结果错位。修复方法是将`create_date`转换为`date`类型。在Spark SQL中,原始代码能正常运行,未出现此问题。因此建议在Hive中使用转换后的日期类型以避免错误。
|
2月前
|
SQL HIVE
【Hive SQL】字符串操作函数你真的会用吗?
本文介绍了SQL中判断字符串是否包含子串的几种方法。`IN`函数判断元素是否完全等于给定元素组中的某项,而非包含关系。`INSTR`和`LOCATE`函数返回子串在字符串中首次出现的位置,用于检测是否存在子串。`SUBSTR`则用于提取字符串的子串。`LIKE`用于模糊匹配,常与通配符配合使用。注意`IN`并非用于判断子串包含。
|
2月前
|
SQL 缓存 Java
Hive 之 UDF 运用(包会的)
Hive的UDF允许用户自定义数据处理函数,扩展其功能。`reflect()`函数通过Java反射调用JDK中的方法,如静态或实例方法。例如,调用`MathUtils.addNumbers()`进行加法运算。要创建自定义UDF,可以继承`GenericUDF`,实现`initialize`、`evaluate`和`getDisplayString`方法。在`initialize`中检查参数类型,在`evaluate`中执行业务逻辑。最后,打包项目成JAR,上传到HDFS,并在Hive中注册以供使用。
|
2月前
|
SQL Java 程序员
Hive反射函数的使用-程序员是怎么学UDF函数的
Hive反射函数的使用-程序员是怎么学UDF函数的
22 0
|
2月前
|
SQL HIVE 数据格式
Hive高频函数(二)
Hive高频函数(二)
24 0
|
2月前
|
SQL 数据采集 数据挖掘
大数据行业应用之Hive数据分析航班线路相关的各项指标
大数据行业应用之Hive数据分析航班线路相关的各项指标
144 1
|
2月前
|
SQL 分布式计算 数据库
【大数据技术Spark】Spark SQL操作Dataframe、读写MySQL、Hive数据库实战(附源码)
【大数据技术Spark】Spark SQL操作Dataframe、读写MySQL、Hive数据库实战(附源码)
164 0
|
12天前
|
SQL 分布式计算 大数据
大数据处理平台Hive详解
【7月更文挑战第15天】Hive作为基于Hadoop的数据仓库工具,在大数据处理和分析领域发挥着重要作用。通过提供类SQL的查询语言,Hive降低了数据处理的门槛,使得具有SQL背景的开发者可以轻松地处理大规模数据。然而,Hive也存在查询延迟高、表达能力有限等缺点,需要在实际应用中根据具体场景和需求进行选择和优化。