在前面的文章中,介紹了可以把Hive當成一個“數據庫”,它也具備傳統數據庫的數據單元,數據庫(Database/Schema)和表(Table)。
本文介紹一下Hive中的數據庫(Database/Schema)和表(Table)的基礎知識,由於篇幅原因,這裏只是一些常用的、基礎的。
二、Hive的數據庫和表
先看一張草圖:
從圖上可以看出,Hive作爲一個“數據庫”,在結構上積極向傳統數據庫看齊,也分數據庫(Schema),每個數據庫下面有各自的表組成。
1. Hive在HDFS上的默認存儲路徑
Hive的數據都是存儲在HDFS上的,默認有一個根目錄,在hive-site.xml中,由參數hive.metastore.warehouse.dir指定。默認值爲/user/hive/warehouse.
2. Hive中的數據庫(Database)
- 進入Hive命令行,執行show databases;命令,可以列出hive中的所有數據庫,默認有一個default數據庫,進入Hive-Cli之後,即到default數據庫下。
- 使用use databasename;可以切換到某個數據庫下,同mysql;
- hive> show databases;
- OK
- default
- lxw1234
- usergroup_mdmp
- userservice_mdmp
- Time taken: 0.442 seconds, Fetched: 4 row(s)
- hive> use lxw1234;
- OK
- Time taken: 0.023 seconds
- hive>
- Hive中的數據庫在HDFS上的存儲路徑爲:
${hive.metastore.warehouse.dir}/databasename.db
比如,名爲lxw1234的數據庫存儲路徑爲:
/user/hive/warehouse/lxw1234.db
- 創建Hive數據庫
使用HDFS超級用戶,進入Hive-Cli,語法爲:
- CREATE (DATABASE|SCHEMA) [IF NOT EXISTS] database_name
- [COMMENT database_comment]
- [LOCATION hdfs_path]
- [WITH DBPROPERTIES (property_name=property_value, ...)];
比如,創建名爲lxw1234的數據庫:
- CREATE DATABASE IF NOT EXISTS lxw1234
- COMMENT 'lxw的大數據田地-lxw1234.com'
- localtion 'hdfs://namenode/user/lxw1234/lxw1234.db/';
創建時候可以指定數據庫在HDFS上的存儲位置。
注意:使用HDFS超級用戶創建數據庫後,該數據庫在HDFS上的存儲路徑的屬主爲超級用戶,如果該數據庫是爲某個或者某些用戶使用的,則需要修改路徑屬主,或者在Hive中進行授權。
- 修改數據庫
修改數據庫屬性:
ALTER (DATABASE|SCHEMA) database_name
SET DBPROPERTIES (property_name=property_value, …);
修改數據庫屬主:
ALTER (DATABASE|SCHEMA) database_name
SET OWNER [USER|ROLE] user_or_role;
- 刪除數據庫
DROP (DATABASE|SCHEMA) [IF EXISTS] database_name
[RESTRICT|CASCADE];
默認情況下,Hive不允許刪除一個裏面有表存在的數據庫,如果想刪除數據庫,要麼先將數據庫中的表全部刪除,要麼可以使用CASCADE關鍵字,使用該關鍵字後,Hive會自己將數據庫下的表全部刪除。RESTRICT關鍵字就是默認情況,即如果有表存在,則不允許刪除數據庫。
3. Hive中的表(Table)
3.1 查看所有的表
進入Hive-Cli,使用use databasename;切換到數據庫之後,執行show tables; 即可查看該數據庫下所有的表:
- hive> show tables;
- OK
- lxw1
- lxw1234
- table1
- t_site_log
3.2 表的存儲路徑
默認情況下,表的存儲路徑爲:
${hive.metastore.warehouse.dir}/databasename.db/tablename/
可以使用desc formatted tablename;命令查看錶的詳細信息,其中包括了存儲路徑:
Location: hdfs://cdh5/hivedata/warehouse/lxw1234.db/lxw1234
3.3 內部表和外部表
Hive中的表分爲內部表(MANAGED_TABLE)和外部表(EXTERNAL_TABLE)。
- 內部表和外部表最大的區別
內部表DROP時候會刪除HDFS上的數據;
外部表DROP時候不會刪除HDFS上的數據;
- 內部表適用場景:
Hive中間表、結果表、一般不需要從外部(如本地文件、HDFS上load數據)的情況。
- 外部表適用場景:
源表,需要定期將外部數據映射到表中。
- 我們的使用場景:
每天將收集到的網站日誌定期流入HDFS文本文件,一天一個目錄;
在Hive中建立外部表作爲源表,通過添加分區的方式,將每天HDFS上的原始日誌映射到外部表的天分區中;
在外部表(原始日誌表)的基礎上做大量的統計分析,用到的中間表、結果表使用內部表存儲,數據通過SELECT+INSERT進入內部表。
3.4 創建表
創建表的語法選項特別多,這裏只列出常用的選項。
其他請參見Hive官方文檔:
https://cwiki.apache.org/confluence/display/Hive/LanguageManual+DDL#LanguageManualDDL-CreateTable
以一個例子來說吧:
CREATE EXTERNAL TABLE t_lxw1234 (
id INT,
ip STRING COMMENT ‘訪問者IP’,
avg_view_depth DECIMAL(5,1),
bounce_rate DECIMAL(6,5)
) COMMENT ‘lxw的大數據田地-lxw1234.com’
PARTITIONED BY (day STRING)
ROW FORMAT DELIMITED
FIELDS TERMINATED BY ‘,’
STORED AS textfile
LOCATION ‘hdfs://cdh5/tmp/lxw1234/';
- 關鍵字EXTERNAL:
表示該表爲外部表,如果不指定EXTERNAL關鍵字,則表示內部表
- 關鍵字COMMENT
爲表和列添加註釋
- 關鍵字PARTITIONED BY
表示該表爲分區表,分區字段爲day,類型爲string
- 關鍵字ROW FORMAT DELIMITED
指定表的分隔符,通常後面要與以下關鍵字連用:
FIELDS TERMINATED BY ‘,’ //指定每行中字段分隔符爲逗號
LINES TERMINATED BY ‘\n’ //指定行分隔符
COLLECTION ITEMS TERMINATED BY ‘,’ //指定集合中元素之間的分隔符
MAP KEYS TERMINATED BY ‘:’ //指定數據中Map類型的Key與Value之間的分隔符
舉個例子:
create table score(name string, score map<string,int>)
ROW FORMAT DELIMITED
FIELDS TERMINATED BY ‘\t’
COLLECTION ITEMS TERMINATED BY ‘,’
MAP KEYS TERMINATED BY ‘:';
要加載的文本數據爲:
biansutao ‘數學':80,’語文':89,’英語':95
jobs ‘語文':60,’數學':80,’英語':99
- 關鍵字STORED AS
指定表在HDFS上的文件存儲格式,可選的文件存儲格式有:
TEXTFILE //文本,默認值
SEQUENCEFILE // 二進制序列文件
RCFILE //列式存儲格式文件 Hive0.6以後開始支持
ORC //列式存儲格式文件,比RCFILE有更高的壓縮比和讀寫效率,Hive0.11以後開始支持
PARQUET //列出存儲格式文件,Hive0.13以後開始支持
- 關鍵詞LOCATION
指定表在HDFS上的存儲位置。