1. 零零散散的概念
1. 系统们:
(1)Hadoop生态系统实现了特别的计算模型 Mapreduce,其可以将计算任务(例如查询)分割为多个处理任务,分散到一群硬件机器上,再将这些任务的计算结果合并,得最终成果。HIVE会监控每一个任务,确保其完成。
(2)文件系统:Hadoop 分布式文件系统(HDFS)。每个数据块(block)会被冗余多份。
(3)HIVE 是基于 Hadoop的一个数据仓库工具,可将结构化的数据文件映射为一张数据库表,且提供了一系列工具来数据提取、转化、加载(ETL)。
2. HIVE 与关系型数据库的区别:
(1)存储系统:HIVE 使用 HDFS,关系型数据库使用本地的文件系统。
(2)HIVE 不支持记录级别的更新、插入或删除,但是可以通过查询生成新表或将查询结果导入到文件。
(3)关系型数据库为实时查询设计,HIVE为海量数据挖掘准备,故实时性较差。
(4)HIVE易扩展存储能力和计算能力。
(5)HIVE中没有键的概念,但是可以对表建立索引。
(6)传统数据库为写时模式,写入数据时检查数据模式;HIVE为读时模式,在查询时验证模式。
3. 关于 Mapreduce:
(1)Map:将输入<键值对>(e.g. key:offset,value:text)转换为0-var个<键值对>(e.g. key:word,value:count)输出;
(2)Sort,Shuffle:按键对Mapper输出的<键值对>排序,将相同键的<键值对>发放给Reducer.
(3)Reduce:将值的集合转化为一个值/另一个集合。
2. HIVE 工作原理
接收一条SQL之后:
Steps | content |
---|---|
词法分析+语法分析 | 将SQL语句解析为抽象语法树 |
语义分析 | 从 Metastore获取元数据信息,验证SQL语句中的表名、列名、数据类型 |
逻辑计划生成 | 生成逻辑计划得到算子树 |
逻辑计划优化 | 对算子树优化,包括列剪枝、分区剪枝、谓词下推等 |
物理计划生成 | 生成包含由 Mapreduce任务组成的有向无环图(DAG)的物理计划 |
物理计划执行 | 将 DAG发送至 Hadoop集群进行执行 |
涉及的组件为:
Components | describe |
---|---|
元存储 Metastore | 存储表的描述信息,任一个适用JDBC的数据库均可作为元存储 |
Driver | 控制HQL生命周期,包含 Query Compiler、Execution engine |
Query Compiler | 执行上表步骤,将HQL编译为DAG |
Execution engine | 执行 DAG |
Hive Server | 提供 JDBC远程服务接口等 |
客户端 | 提供命令行接口(HIVE CLI等) |
3. HIVE CLI
命令行参数如下:
Parameters | describe |
---|---|
-d<key=value> | 将 value赋值给 key |
–database< databasename> | 指定所用数据库 |
-e< SQL> | 执行 SQL语句 |
-f< filename> | 执行文件中的SQL |
-S | 静音模式,在输出中去掉无关信息 |
-H | 帮助信息,以上用 hive-H均可查看。 |
4. 数据类型
(1)基本数据类型如下:
type | type | type |
---|---|---|
TINYINT | SMALINT | INT |
BIGINT | BOOLEAN | FLOAT |
DOUBLE | STRING | TIMESTAMP |
BINARY |
相近类型可隐式转换,否则可用 cast(var AS type)。
(2)复杂数据类型与调用格式:
type | describe | example | DDL | cite |
---|---|---|---|---|
STRUCT | like “object” | STRUCT(“C++”,“PY”) | STRUCT< 1st:STRING,2nd:STRING> | col.2nd |
MAP | <键值对>元组 | MAP(“C++”,1,“PY”,2) | MAP< STRING,INT> | col[“PY”] |
ARRAY | 相同类型变量集合 | ARRAY(“C++”,“PY”) | ARRAY< STRING> | col[1] |
- STRUCT可以混合多种不同的数据类型,但是结构一经定义,字段位置不可变。MAP中的<键值对>是无序的;ARRAY中的变量是有序的。
- 在JOSN中MAP与STRUCT实际上一样。
5. 文本文件数据编码
为了避免逗号或制表符出现在文本中的情况,换种方式分隔文本文件。
sep | describe | code in “CREATE TABLE” |
---|---|---|
\n | 分隔记录(行) | TERMINATED BY ‘\n’ |
^A | 分隔字段(列) | TERMINATED BY ‘\001’ |
^B | 分隔元素 | TERMINATED BY ‘002’ |
^C | 分隔 MAP中的键和值 | TERMINATED BY ‘003’ |
编码举例:
CREATE TABLE employees(
name STRING,
salary FLOAT,
subordinates ARRAY<STRING>
deductions MAP<STRING,FLOAT>
address STRUCT<street:STRING,city:STRING>
)
ROW FORMAT LIMITED
LINES TERMINATED BY '\n'
FIELDS TERMINATED BY '\001'
COLLECTION ITEMS TERMINATED BY '\002'
MAP KEYS TERMINATED BY '\001'
下期预告:数据定义(DDL)
参考资料
- Hive编程指南[O’REILLY],人民邮电出版社
- Hive编程技术与应用,中国水利水电出版社
- JD_DYNAMIC 课程笔记