这是我参与「第四届青训营 」笔记创作活动的第11天
Hive
可以将结构化数据映射成一张数据表,并提供类SQL的查询功能,本质是将SQL语句转化成MapReduce程序;
Hive元数据默认存储在derby数据库,不支持多客户端访问,所以将元数据存储在MySQL,支持多客户端访问。
以下均为个人总结,如果不正确之处,劳请指正,共同进步!!
与数据库比较
- 类似的查询语句;
- 数据存储在HDFS;
- 数据更新不建议改写;
- 执行延迟较高,需要将hql转换为Map Reduce跑job;
- 数据规模很大;
建表
CREATE [EXTERNAL] TABLE [IF NOT EXISTS] table_name / *创建[外部]表* /
[(col_name data_type [COMMENT col_comment], ...)]
[COMMENT table_comment]
[PARTITIONED BY (col_name data_type [COMMENT col_comment], ...)] / *分区* /
[CLUSTERED BY (col_name, col_name, ...) / *分桶表* / [SORTED BY (col_name [ASC|DESC], ...)] INTO num_buckets BUCKETS] / *桶内排序* /
[ROW FORMAT row_format] / *格式化表* /
[STORED AS file_format] / *指定存储文件类型* /
[LOCATION hdfs_path] / *指定表在HDFS的路径* /
[TBLPROPERTIES (property_name=property_value, ...)] / ** /
[AS select_statement] / *根据查询结果创建表* /
/ *格式化表种类* /
DELIMITED
[FIELDS TERMINATED BY char] / *指定分隔符* /
[COLLECTION ITEMS TERMINATED BY char]
[MAP KEYS TERMINATED BY char]
[LINES TERMINATED BY char]
|
SERDE serde_name
[WITH SERDEPROPERTIES (property_name=property_value, property_name=property_value, ...)]
内部(管理)表和外部表external
元数据:指向原始数据的路径;原始数据:数据的存储位置
内部表 | 外部表 | |
---|---|---|
创建 | 移动原始数据 | 路径记录到元数据 |
删除 | 元 / 原始数据都删 | 只删除元数据 |
四个By
- Order By:全局排序,只有一个Reducer;
- Sort By:分区内有序;
- Distrbute By:根据指定字段进行分区,将数据划分到不同reduce中,结合sort by使用,distrbute by 在前(例如按学院编号分区,学生学号排序);
- Cluster By:当Distribute by和Sorts by字段相同时,可以使用Cluster by方式,只能升序;
常用函数
- nvl(val,def_val):返回非空值否则null;
- coalesce(v1,v2,...):返回第一个非空值否则null;
- CASE WHEN THEN ELSE END :多分支;
- grouping_set:多维分析;
- cast(col as type):格式转换;