一、函数的分类

从输入输出角度分类
标准函数:一行数据中的一列或多列为输入,结果为单一值
聚合函数:多行的零列到多列为输入,结果为单一值
表生成函数:零个或多个输入,结果为多列或多行
从实现方式分类
内置函数
自定义函数
UDF:自定义标准函数
UDAF:自定义聚合函数
UDTF:自定义表生成函数

二、Hive内置函数

Hive提供大量内置函数供开发者使用

  • 标准函数
  • 字符函数
  • 类型转换函数
  • 数学函数
  • 日期函数
  • 集合函数
  • 条件函数
  • 聚合函数
  • 表生成函数

这里整理了一些常用的函数:
2.1字符函数

  • lower(String A)/Upper(String A) :将字符串A 的所有字母转换成小写/大写字母
  • length(String A):返回字符串的长度
  • concat(字符串A,字符串B):字符串拼接A+B

2.2数学函数

  • **round(double a,int d)😗*返回对a四舍五入并保留d位小数位的值

2.3日期函数

  • date_format(date/timestamp/string ts, string fmt): 按指定格式返回时间date
    如:date_format(“2016-06-22”,“MM-dd”)=06-22

  • **datediff(string enddate, string startdate)😗*计算开始时间到结束时间相差的天数

  • current_timestamp:返回当前时间戳
    2.4条件函数

  • nvl(T value, T default_value):value为NULL返回default_value,否则返回value

  • if(boolean testCondition, T valueTrue,
    T valueFalseOrNull)

    如果testCondition
    为true就返回valueTrue,否则返回valueFalseOrNull

三、UDF开发流程

  • 继承UDF类或GenericUDF类

  • 重写evaluate()方法并实现函数逻辑

  • 编译打包为jar文件

  • 复制到正确的HDFS路径

  • 调用函数

具体实现的步骤:

1.java继承UDF类编写udf函数(evaluate())(一个类一个方法)
2.打fat包(包括所有依赖文件)
3.把jar包梵高linux上
–临时Udf函数
4.在hive命令行李使用add jar jar包路径即可加载到临时系统中
5.create temporary function 函数名 as ‘方法的全类名’;
–永久Udf函数
4.在Linux命令行使用Hdfs命令把Jar包上传到hdfs的路径
5.create function 函数名 as '方法的全类名’;
using jar ‘jar包的hdfs路径’;

hdfs -put –f df-hiveudf-1.0-SNAPSHOT.jar /apps/hive/functions 
-- beeline中create函数并使用
CREATE FUNCTION str_lower AS 'cn.kgc.hiveudf.udf.StringLower' 
USING JAR 'hdfs:////apps/hive/functions/df-hiveudf-1.0-SNAPSHOT.jar';
select str_lower(name), work_place from employee; 
四、hive事务

事务(Transaction )指一组单元化操作,这些操作要么都执行,要么都不执行。
4.1:ACID特性

  • Atomicity:原子性
  • Consistency:一致性
  • Isolation:隔离性
  • Durability:持久性

4.2:特点和局限性
支持INSERT、DELETE、UPDATE(v2.2.0开始支持Merge);
文件格式只支持ORC。
局限性:

  • 表必须是bucketed表
  • 需要消耗额外的时间、资源和空间
  • 不支持开始、提交、回滚、桶或分区列上的更新
  • 锁可以为共享锁或排它锁(串联的而不是并发)
  • 不允许从一个非ACID连接读写ACID表
  • 使用较少
五、hive的优化设计
  1. 使用分区表、桶表
  2. 使用索引
  3. 使用适当的文件格式,如orc, avro, parquet
  4. 使用适当的压缩格式,如snappy
  5. 考虑数据本地化 - 增加一些副本
  6. 避免小文件
  7. 使用Tez引擎代替MapReduce
  8. 使用Hive LLAP(在内存中读取缓存)
  9. 考虑在不需要时关闭并发

查询优化
自动启动Map端Join
防止数据倾斜

set hive.optimize.skewjoin=true;

启用CBO(Cost based Optimizer)

set hive.cbo.enable=true; 
set hive.compute.query.using.stats=true; 
set hive.stats.fetch.column.stats=true; 
set hive.stats.fetch.partition.stats=true;	

启动Vectorization(矢量化)

set hive.vectorized.execution.enabled = true; 
set hive.vectorized.execution.reduce.enabled = true;
六、压缩算法

1.减少传输数据量,会极大提升MapReduce性能

  • 采用数据压缩是减少数据量的很好的方式
    2.常用压缩方法对比
    在这里插入图片描述
Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐