A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 我是楠楠 于 2018-9-7 15:31 编辑

【郑州校区】大数据离线阶段Day5之Hive 函数

1. 内置运算符
在Hive有四种类型的运算符:
· 关系运算符
· 算术运算符
· 逻辑运算符
· 复杂运算
内容较多,见《Hive官方文档》或者《hive常用运算和函数.doc》
2. 内置函数
测试各种内置函数的快捷方法:
创建一个dual表
create table dual(id string);
load一个文件(只有一行内容:内容为一个空格)到dual表
select substr('angelababy',2,3) from dual;
内容较多,见《Hive官方文档》或者《hive常用运算和函数.doc》
3. Hive 自定义函数和Transform
当Hive提供的内置函数无法满足你的业务处理需要时,此时就可以考虑使用用户自定义函数(UDF:user-defined function)。
3.1. UDF 开发实例
新建JAVA maven项目
添加 hive-exec-1.2.1.jar和hadoop-common-2.7.4.jar依赖(见参考资料)
1、写一个java类,继承UDF,并重载evaluate方法
package cn.itcast.bigdata.udf
import org.apache.hadoop.hive.ql.exec.UDF;
import org.apache.hadoop.io.Text;
public class Lower extends UDF{
        public Text evaluate(Text s){
                if(s==null){return null;}
                return new Text(s.toString().toLowerCase());
        }
}
2、打成jar包上传到服务器
3、将jar包添加到hive的classpath
hive>add JAR /home/hadoop/udf.jar;
4、创建临时函数与开发好的java class关联
create temporary function tolowercase as 'cn.itcast.bigdata.udf.ToProvince';
5、即可在hql中使用自定义的函数tolowercase ip
Select tolowercase(name),age from t_test;

3.2. Transform实现(了解)
Hive的 TRANSFORM 关键字提供了在SQL中调用自写脚本的功能
适合实现Hive中没有的功能又不想写UDF的情况
使用示例1:下面这句sql就是借用了weekday_mapper.py对数据进行了处理.
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])

4. Hive 特殊分隔符处理(扩展)
hive读取数据的机制:
首先用InputFormat<默认是:org.apache.hadoop.mapred.TextInputFormat >的一个具体实现类读入文件数据,返回一条一条的记录(可以是行,或者是你逻辑中的“行”)
然后利用SerDe<默认:org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe>的一个具体实现类,对上面返回的一条一条的记录进行字段切割。
Hive对文件中字段的分隔符默认情况下只支持单字节分隔符,如果数据文件中的分隔符是多字符的,如下所示:
01||zhangsan
02||lisi
可用使用RegexSerDe通过正则表达式来抽取字段
drop table t_bi_reg;
create table t_bi_reg(id string,name string)
row format serde 'org.apache.hadoop.hive.serde2.RegexSerDe'
with serdeproperties(
'input.regex'='(.*)\\|\\|(.*)',
'output.format.string'='%1$s %2$s'
)
stored as textfile;
hive>load data local inpath '/root/hivedata/bi.dat' into table t_bi_reg;
hive>select * from t_bi_reg;
其中:
input.regex:输入的正则表达式
        表示 || 左右两边任意字符被抽取为一个字段
output.format.string:输出的正则表达式
        %1$s  %2$s则分别表示表中的第一个字段、第二个地段
注意事项:
a、使用RegexSerDe类时,所有的字段必须为string
b、input.regex里面,以一个匹配组,表示一个字段
传智播客·黑马程序员郑州校区地址
河南省郑州市 高新区长椿路11号大学科技园(西区)东门8号楼三层
联系电话 0371-56061160/61/62
来校路线  地铁一号线梧桐街站A口出

0 个回复

您需要登录后才可以回帖 登录 | 加入黑马