首页 > 代码库 > Hive(四)hive函数与hive shell

Hive(四)hive函数与hive shell

一、hive函数

    技术分享

     1、hive内置函数

        (1)内容较多,见《 Hive 官方文档》
            https://cwiki.apache.org/confluence/display/Hive/LanguageManual+UDF
        (2)详细解释:
            http://blog.sina.com.cn/s/blog_83bb57b70101lhmk.html

         (3) 测试内置函数的快捷方式:

                 1、创建一个 dual 表 create table dual(id string);
                  2、 load 一个文件(一行,一个空格)到 dual 表
                  3、 select substr(‘huangbo‘,2,3) from dual;

          (4)查看内置函数  show  functions;

                 显示函数的详细信息 desc function abs;

                  显示函数的扩展信息  desc function extended concat;

           (5)详细使用见文档

    2、hive自定义函数

当 Hive 提供的内置函数无法满足你的业务处理需要时,此时就可以考虑使用用户自定义函 数
UDF ( user-defined function)作用于单个数据行,产生一个数据行作为输出。(数学函数, 字符串函数)
UDAF(用户定义聚集函数 User- Defined Aggregation Funcation):接收多个输入数据行,并产 生一个输出数据行。( count, max)

    3、一个简单的UDF函数示例:

         (1)先开发一个简单的 java 类,继承 org.apache.hadoop.hive.ql.exec.UDF,重载 evaluate 方法

技术分享

        (2)打成jar包上传到服务器

         (3) 将 jar 包添加到 hive 的 classpath

                hive>add JAR /root/hivejar /udf.jar;

         (4)创建临时函数与开发好的 class 关联起来

 Hive>create temporary function tolowercase as ‘ com.mazh.udf. ToLowerCase ‘;

          (5)至此,便可以在 hql 在使用自定义的函数

select tolowercase(name),age from studentss;

      4、Transform实现   (把json数据中timeStamp字段变成日期编号)

Hive 的 TRANSFORM 关键字提供了在 SQL 中调用自写脚本的功能。适合实现 Hive 中没有的 功能又不想写 UDF 的情况
具体以一个实例讲解。     

(1)先加载 rating.json 文件到 hive 的一个原始表 rat_json
create table rat_json(line string) row format delimited;
load data local inpath ‘/root/rating.json‘ into table rat_json;
(2) 创建 rate 这张表用来存储解析 json 出来的字段:
create table rate(movie int, rate int, unixtime int, userid int) row format delimited fields
terminated by ‘\t‘;
解析 json,得到结果之后存入 rate 表:
insert into table rate select get_json_object(line,‘$.movie‘) as moive,get_json_object(line,‘$.rate‘)
as rate,get_json_object(line,‘$.timeStamp‘) as unixtime,get_json_object(line,‘$.uid‘) as userid
from rat_json;
(3)使用 transform+python 的方式去转换 unixtime 为 weekday
先编辑一个 python 脚本文件

vi weekday_mapper.py

#!/bin/python
import sys
import datetime
for line in sys.stdin:
line = line.strip()
movie,rate,unixtime,userid = line.split(‘\t‘)
weekday = datetime.datetime.fromtimestamp(float(unixtime)).isoweekday()
print ‘\t‘.join([movie, rate, str(weekday),userid])

保存文件
然后,将文件加入 hive 的 classpath:

技术分享

最后查询看数据是否正确:
select distinct(weekday) from lastjsontable;

二、Hive  Shell  操作

 

Hive(四)hive函数与hive shell