Hive简介
Hive是基于Hadoop的数据仓库软件,可以查询和管理PB级别的分布式数据。
Hive特性:
- 灵活方便的ETL(extract/transform/load)。
- 支持Tez、Spark等多种计算引l擎。
- 可直接访问HDFS文件以及HBase。
- 易用易编程。
Hive的应用场景
Hive与传统数据仓库比较
Hive的优点
Hive的架构
Hive运行流程
- Client提交HQL命令。
- Tez执行查询。
- YARN为群集中的应用程序分配资源,并为YARN队列
- 中的Hive作业启用授权。
- Hive根据表类型更新HDFS或Hive仓库中的数据。
- Hive通过JDBC连接返回查询结果。
Hive数据存储模型
Hive分区和分桶
分区:数据表可以按照某个字段的值划分分区。
- 每个分区是一个目录。
- 分区数量不固定。
- 分区下可再有分区或者桶。
桶:数据可以根据桶的方式将不同数据放入不同的桶中。
- 每个桶是一个文件。
- 建表时指定桶个数,桶内可排序。
- 数据按照某个字段的值Hash后放入某个桶中。
Hive数据存储模型-托管表和外部表
Hive可以创建托管表和外部表:
- 创建Hive表,Hive会将数据移动到数据仓库目录。
- 如果所有处理都由Hive完成,建议使用托管表。
- 如果要用Hive和其它工具来处理同一个数据集,建议使用外部表
Hive支持的函数
Hive内置函数:
- 数学函数,如round()、floor()、abs()、rand()等
- 日期函数,如to_date()、month()、day(等
- 字符串函数,如trim()、length()、substr()等
UDF(User - Defined Funcation)
Hive使用方式
-
Running HiveServer2 and Beeline
$ $HIVE_HOME/bin/hiveserver2$ $HIVE_HOME/bin/beeline -u jdbc:hive2://$HS2_HOST:$HS2_PORT -
Running Hcatalog
$ $HIVE_HOME/hcatalog/sbin/hcat_server.sh -
Running WebHCat(Templeton)
$ $HIVE_HOME/hcatalog/sbin/webhcat_server.sh
HiveSQL介绍
-
DDL-数据定义语言
建表,修改表,删表、分区、数据类型。
-
DML-数据管理语言
数据导入、数据导出。
-
DQL-数据查询语言
简单查询。
复杂查询Group by,Order by,Join等。
DDL操作
-
创建表
hive> CREATE TABLE pokes (foo INT, bar STRING);hive> CREATE TABLE invites (foo INT, bar STRING) PARTITIONED BY (ds STRING); -
浏览表
hive> SHOW TABLES; -
描述表
hive> DESCRIBE invites; -
修改表
hive> ALTER TABLE events RENAME TO 3koobecaf;hive> ALTER TABLE pokes ADD COLUMNS (new_col INT);
DML操作
-
向表里加载数据
hive> LOAD DATA LOCAL INPATH './examples/files/kv1.txt' OVERWRITE INTO TABLE pokes;hive> LOAD DATA LOCAL INPATH './examples/files/kv2.txt' OVERWRITE INTO TABLE invites PARTITION (ds='2008-08-15'); -
导出数据到HDFS
EXPORT TABLE invites TO '/department';
DQL操作
-
SELECTS and FILTERS
hive> SELECT a.foo FROM invites a WHERE a.ds='2008-08-15';hive> INSERT OVERWRITE DIRECTORY '/tmp/hdfs_out' SELECT a.* FROM invites a WHERE a.ds='2008-08-15'; -
GROUP BY
hive> FROM invites a INSERT OVERWRITE TABLE events SELECT a.bar, count(*) WHERE a.foo > 0 GROUP BY a.bar;hive> INSERT OVERWRITE TABLE events SELECT a.bar, count(*) FROM invites a WHERE a.foo > 0 GROUP BY a.bar; -
MULTITABLE INSERT
FROM src INSERT OVERWRITE TABLE dest1 SELECT src.* WHERE src.key < 100 INSERT OVERWRITE TABLE dest2 SELECT src.key, src.value WHERE src.key >= 100 and src.key < 20O; -
JOIN
hive> FROM pokes t1 JOIN invites t2 ON (t1.bar = t2.bar) INSERT OVERWRITE TABLE events SELECT t1.bar, t1.foo, t2.foo; -
STREAMING
hive> FROM invites a INSERT OVERWRITE TABLE events SELECT TRANSFORM(a.foo, a.bar) AS (oof, rab) USING '/bin/cat' WHERE a.ds > '2008-08-09';
总结
- Hive是分布式数据仓库,本章介绍了Hive的应用场景、基本原理、架构和运行流程以及常用的Hive SQL语句。