文章目录
Hive函数与调优
函数
-
系统内置函数
1.查看系统自带的函数
hive> show functions;
2.显示自带的函数的用法 hive> desc function upper;
3.详细显示自带的函数的用法 hive> desc function extended upper;
-
自定义函数
根据用户自定义函数类别分为以下三种:
(1)UDF(User-Defined-Function)
一进一出
(2)UDAF(User-Defined Aggregation Function)
聚集函数,多进一出
类似于:count/max/min
(3)UDTF(User-Defined Table-Generating Functions)
一进多出
如 lateral view explode()1.UDF函数
(1)继承 org.apache.hadoop.hive.ql.exec.UDF
(2)需要实现 evaluate 函数;evaluate 函数支持重载;
(3)在 hive 的命令行窗口创建函数
a)添加 jar add jar linux_jar_path
b)创建 function
create [temporary] function [dbname.]function_name AS class_name;
(4)在 hive 的命令行窗口删除函数 Drop [temporary] function [if exists] [dbname.]function_name;
注意事项
(1)UDF 必须要有返回类型,可以返回 null,但是返回类型不能为 void;2.UDTF函数
package com.ityouxin.hive; import org.apache.hadoop.hive.ql.metadata.HiveException; import org.apache.hadoop.hive.ql.udf.generic.GenericUDTF; import org.apache.hadoop.hive.serde2.objectinspector.ObjectInspector; import org.apache.hadoop.hive.serde2.objectinspector.ObjectInspectorFactory; import org.apache.hadoop.hive.serde2.objectinspector.StructObjectInspector; import org.apache.hadoop.hive.serde2.objectinspector.primitive.PrimitiveObjectInspectorFact ory; import java.util.ArrayList; import java.util.List; public class MyUDTF extends GenericUDTF { com.ityouxin.hive; import org.apache.hadoop.hive.ql.metadata.HiveException; import org.apache.hadoop.hive.ql.udf.generic.GenericUDTF; import org.apache.hadoop.hive.serde2.objectinspector.ObjectInspector; import org.apache.hadoop.hive.serde2.objectinspector.ObjectInspectorFactory; import org.apache.hadoop.hive.serde2.objectinspector.StructObjectInspector; import org.apache.hadoop.hive.serde2.objectinspector.primitive.PrimitiveObjectInspectorFact ory; import java.util.ArrayList; import java.util.List; public class MyUDTF extends GenericUDTF { //定义一个存储列的值的数组,list长度为1,map长度为2 private final transient Object[] forwardListObj = new Object[1]; @Override public StructObjectInspector initialize(StructObjectInspector argOIs) { List<String> fieldNames=new ArrayList<>(); //设置字段名 fieldNames.add("column_01"); List<ObjectInspector> fieldOIs=new ArrayList<>(); //设置字段类型 fieldOIs.add(PrimitiveObjectInspectorFactory.javaStringObjectInspector); return ObjectInspectorFactory.getStandardStructObjectInspector(fieldNames, fieldOIs); } @Override public void process(Object[] args) throws HiveException { //1.获取原始数据 String arg =args[0].toString(); //2.获取数据传入的第二个参数, 此处为分隔符 String splitKey = args[1].toString(); //3.将原始数据按照传入的分隔符进行切分 String[] fields = arg.split(splitKey); //4.遍历切分后的结果,并写出 for (String field : fields) { //将每一个单词添加至对象数组 forwardListObj[0]=field; //将对象数组内容写出 forward(forwardListObj); } } @Override public void close() throws HiveException { } } 3) 打成 jar 包上传到服务器/opt/module/data/udtf.jar 4) 将 jar 包添加到 hive 的 classpath 下 hive (default)> add jar /opt/module/data/udtf.jar; 5) 创建临时函数与开发好的 java class 关联 hive (default)> create temporary function myudtf as "com.ityouxin.hive.MyUDTF"; 6) 即可在 hql 中使用自定义的函数 hive (default)> select myudtf(line, ",") word from words
调优
-
开启map阶段输出压缩
1.开启 hive 中间传输数据压缩功能
hive (default)>set hive.exec.compress.intermediate=true;
2.开启 mapreduce 中 map 输出压缩功能 hive (default)>set mapreduce.map.output.compress=true;
3.设置 mapreduce 中 map 输出数据的压缩方式 hive (default)>set mapreduce.map.output.compress.codec= org.apache.hadoop.io.compress.SnappyCodec;
4.执行查询语句 hive (default)> select count(ename) name from emp;
-
开启reducer阶段的数据压缩
1.开启 hive 最终输出数据压缩功能
hive (default)>set hive.exec.compress.output=true;
2.开启 mapreduce