本文介紹一下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
2.1 創建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中進行授權,
2.2 修改資料庫
修改資料庫屬性:
ALTER (DATABASE|SCHEMA) database_name
SET DBPROPERTIES (property_name=property_value, …);
修改資料庫屬主:
ALTER (DATABASE|SCHEMA) database_name
SET OWNER [USER|ROLE] user_or_role;
2.3 洗掉資料庫
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官方檔案:
添加鏈接描述
以一個例子來說吧:
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上的存盤位置,
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/261359.html
標籤:其他
上一篇:【C++】多型進階
下一篇:什么是快取穿透,如何解決?
