Hive中的數據庫(Database)和表(Table)

前面的文章中,介紹了可以把Hive當成一個“數據庫”,它也具備傳統數據庫的數據單元,數據庫(Database/Schema)和表(Table)。

本文介紹一下Hive中的數據庫(Database/Schema)和表(Table)的基礎知識,由於篇幅原因,這裏只是一些常用的、基礎的。

二、Hive的數據庫和表

先看一張草圖:

Hive結構

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;
  1. hive> show databases;
  2. OK
  3. default
  4. lxw1234
  5. usergroup_mdmp
  6. userservice_mdmp
  7. Time taken: 0.442 seconds, Fetched: 4 row(s)
  8. hive> use lxw1234;
  9. OK
  10. Time taken: 0.023 seconds
  11. hive>
  • Hive中的數據庫在HDFS上的存儲路徑爲

${hive.metastore.warehouse.dir}/databasename.db

比如,名爲lxw1234的數據庫存儲路徑爲:

/user/hive/warehouse/lxw1234.db

  • 創建Hive數據庫

使用HDFS超級用戶,進入Hive-Cli,語法爲:

  1. CREATE (DATABASE|SCHEMA) [IF NOT EXISTS] database_name
  2. [COMMENT database_comment]
  3. [LOCATION hdfs_path]
  4. [WITH DBPROPERTIES (property_name=property_value, ...)];

比如,創建名爲lxw1234的數據庫:

  1. CREATE DATABASE IF NOT EXISTS lxw1234
  2. COMMENT 'lxw的大數據田地-lxw1234.com'
  3. 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; 即可查看該數據庫下所有的表:

  1. hive> show tables;
  2. OK
  3. lxw1
  4. lxw1234
  5. table1
  6. 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上的存儲位置。

Hive相關文章(持續更新)

一起學Hive系列

Hive分析函數系列

Hive索引

hive優化之——控制hive任務中的map數和reduce數

轉載請註明:lxw的大數據田地 » [一起學Hive]之三–Hive中的數據庫(Database)和表(Table)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章