参数配置
- 三种方式:
- 配置文件 (全局有效 默认 hive-default.xml 自定义配置会覆盖默认配置)
- 命令行参数 (对hive启动实例有效 bin/hive --hiveconf)
- 参数声明 (对hive连接的当前session有效 set)
- 注意: 系统级别的参数,只能使用2和1,这些参数读取在session建立之前,例如log4j
优先级: 3>2>1
- hive shell 命令行
bin/hive 命令
-i 初始化hql文件
-e 从命令行执行指定的hql
-f 执行hql脚本
-v 输出执行的hql语句
内嵌函数
概念: 可以通过show functions语句来查看到的函数
-
内嵌函数分类:
- 内置函数
- 数学函数
e.g: round, floor, ceil, rand, sin ,asin ,cos, acos ,abs - 字符函数
e.g: length, reverse, concat ,concat_ws, substr, upper, lower, trim, ltrim ,rtrim regexp_replace ,regexp_extract ,parse_url ,get_json_object ,split ,find_in_set ,instr - 收集函数
e.g: - 转换函数
e.g: cast - 日期函数
e.g:
1. from_unixtime 将时间戳转换为标准日期格式,用于取年月日,做分组
2. unix_timestamp 将标准日期转换为时间戳格式,用于计算时间差
to_date ,year ,month, day, hour ,minute ,second ,weekofyear ,datediff ,date_add ,date_sub - 条件函数
e.g: IF COALESCE CASE WHEN THEN
- 数学函数
- 聚合函数
e.g: - 表生产函数
e.g: explode, parse_url_tuple ,json_tuple
- 内置函数
自定义函数
- 自定义函数分类:
- UDF 普通函数 一进一出
步骤:
1. 继承UDF类,并重载evaluate方法
2. 将自定义类打成jar包,并上传到服务器
3. 将jar包使用 hive命令 add jar xxx.jar 添加到classpath
4. 创建临时函数与开发好的java class 关联 (create temporary function 函数名 as '类全 路径名')
5. 使用自定义函数 - UDAF 聚合函数 多进一处
步骤: 继承UDAF类,重写iterate方法
方法: init,iterate(迭代计算,真正实现聚合的方法,返回最终结果),terminatePartial(局部 聚合的方法,分布式计算中会调用,得到局部聚合结果),merge(实现聚合的方法,本质上要调 用iterate) - UDTF 表生成函数 一进多出
步骤: 继承UDTF类,重写process方法
方法: initialize(初始化),process(真正实现转换的方法),close(关闭资源的方法)
注意: udtf只能直接在select语句中使用,不能嵌套使用,不能与cluster by/group by/sort by/distribute by 一起使用,可以与order by 共用,查询结果是一张表,不可以和其他字段一 起使用,一般配合lateral view 使用;tableA lateral view explode() as a,b,c
e.g:
1. explode()函数,它是一个可以将map或者array类型的字段展开的函数,array中一个元素一条数据,map中一个kv一条数据,
- UDF 普通函数 一进一出
反射函数
- 反射函数:reflect(类路径,方法名,参数1,参数2,...)
- 该函数可以支持在sql中调用java中自带函数,可以是一个实例对象的方法,也可以是静态类的方法,但是该方法必须返回的是一个基础类型,或者是hive能识别的序列化类型
窗口函数
场景:当业务需要即显示聚合之后的数据,又要显示聚合之前的数据时,便引入了窗口函数
意义:窗口函数又叫olap函数/分析函数,窗口函数兼具有分组和排序两种功能,带rows between 的也叫windows子句
语法: over(partition by xxx order by xxxx)
-
功能实现:
- 聚合函数() + over(partition by xxx order by xxxx)
e.g: SUM、AVG、COUNT、MAX、MIN、LAG、LEAD、FIRST_VALUE、LAST_VALUE
lag: 取每个分区内某列前n个值
lead: 取每个分区内某列后n个值
first_value: 取每个分区内某列第一个值
last_value: 取每个分区内某列最后一个值 - 排序函数() + over(partition by xxx order by xxxx)
e.g: ROW_NUMBER、RANK、DENSE_RANK、NTILE
- 聚合函数() + over(partition by xxx order by xxxx)
-
补充:
partition by,是按照某一列进行分区,这一列值相同的行会放到一起
如果不指定rows between 默认为从分区内的起点到当前行
如果不指定order by,则将分组内所有值累加,分组内排序,指定order by 则默认从起点到当前行举例: 聚合函数(col) over(partition by xxx order by xxx rows between 指定范围) as col_n
指定范围: rows between num_line preceding and num_line following
-- preceding 往前
-- following 往后
-- current row 当前行
-- unbounded 无边界排序函数:
1. row_number(): 从1开始,按照顺序,生成分组内记录的序列, 1 2 3 4 5
2. rank():生成分组内数据项的排名,排名相等会在名次中留下空位, 1 2 3 3 5
3. dense_rank():生成分组内数据项的排名,排名相等不会在名次中留下空位, 1 2 3 3 4比率函数:
1.ntile():将每个分区内排序后的结果均分成N份,如果不能均分,会优先分配数字小的
数仓分层结构及意义
- 数据源: 一般有(业务数据库数据,爬虫数据,数据流数据,日志数据,文档数据)
- ETL: 一个过程,用于数据的预处理,不属于分层结构
- ODS: 操作数据层/原数据层,临时存储层, 刚经过etl预处理的过滤之后的数据,一般以ods_tb命名
- DWD: 详细数据层,此层数据为ods层数据进行进一步etl转换和补全后得到的数据,构建宽表,一致,准确,干净
- DWS: 汇总数据层,将dwd层中构建的宽表,根据每个主题中的业务拆分不同的分析模型子表,后期在主题中实现分析应用
- ADS: 数据应用层,web前端展示直接读取的数据源,一般有(数据挖掘,数据分析,即席查询,报表展示)
- 意义:
- 减少数据之间的耦合性;如果不分层的话,源数据业务系统的业务规则发生变化将会影响整个数据清洗过程,工作量巨大
- 用空间换时间;同过分层来拆分数据清洗的过程,通过大量预处理和各个层次的步骤分析来简化清洗的过程
数据仓库的特性
面向主题: 区别于数据库的面向业务,主题是各个子业务系统数据库的一个数据综合体,即对应企业中某一宏观分析领域所涉及的分析对象;例如保险行业中,车险,财险,寿险是各个业务,如果分析保险行业发展,则这些保险数据综合起来是一个保险主题
集成性: 因为面向主题的特性,数据仓库中的数据都是由各个子业务系统的数据集合而来,
非易失性:也叫不可更新性,因为数据仓库时面向分析,支持企业决策的,所以不需要像传统数据库那样保证数据的实时更新,只需要保存过去的数据,用来反映过去一段时间以来历史数据的规律和内容即可,规律是客观存在的,不需要人为加以干预,所以只需要保证数仓中历史数据的加载和更新即可,不需要对数仓中的数据进行频繁的修改和删除;
时变性: 数据是历史的,需要保持更新以便更好的服务企业决策,但由于企业业务的各种发展和变化,数据在过去的时间内也会不断地产生变化,进入数仓的数据也会呈现各种不同的变化