Hive DDL 操作
操作前需要保證 hive 成功啟動:
# 啟動 HiveServer2
hive --service hiveserver2 &
# 啟動 MetaStore
hive --service metastore &
# 進入 hive 命令列介面
beeline -u jdbc:hive2://node03:10000 -n root
資料庫操作
操作類似於 MySQL 資料庫操作。
表基本操作
hive 中表資料涉及兩部分,一部分是儲存在 HDFS 上的真實資料;一部分是儲存在 MetaStore 中的後設資料(包含表結構、許可權、屬性等資訊)。
hive 包括內表和外表,其中內表主要使用的表形式,外表一般作為資料匯入時的臨時表使用。內表對 HDFS 上的資料有所有權,而外表對 HDFS 上儲存的資料沒有所有權,僅有讀許可權。
為什麼需要外表?
- 一般結構化資料到達 Hadoop 平臺時,可能存在編碼、換行符、髒資料的問題,不能直接匯入到 Hive 中儲存為內表。於是再資料接入之前先建立外表,指定表的後設資料資訊(
create table t1(col1 type, col2 type ..)
),因為有讀的許可權,可以從外表中查詢資料,以確保後設資料資訊是否正確,編碼是否合理。 - 確保資料合理性前提下,再建立內表,將外表資料查詢出來,匯入到內表中。
外表建立語法:
CREATE EXTERNAL TABLE <table_name>
(<col_name> <data_type> [, <col_name> <data_type> ...])
ROW FORMAT DELIMITED
FIELDS TERMINATED BY 'xxx'
COLLECTION ITEMS TERMINATED BY 'xxx'
MAP KEYS TERMINATED BY 'xxx'
LINES TERMINATED BY 'xxx'
LOCATION '<file_path>';
ROW FORMAT DELIMITED
:標誌開始設定分隔符;FIELDS TERMINATED BY 'xxx'
:資料的欄位透過 'xxx' 分割開;COLLECTION ITEMS TERMINATED BY 'xxx'
:複雜型別資料透過 'xxx' 分割;MAP KEYS TERMINATED BY 'xxx'
:複雜元素 MAP 透過xxx
分割;LINES TERMINATED BY 'xxx'
:定義行分隔符;LOCATION '<file_path>'
:指定資料在 HDFS 上的儲存路徑;
資料建立及匯入示例:
源資料:
1,tom,18,music-game-driver,std_addr
2,jolin,21,music-movie,std_addr:beijing-work_addr:shanghai-addr:tokyo
3,tony,33,book-game-food,std_addr:beijing-work_addr:xian
4,lilei,12,scl_addr:xizhimen-home_addr:null
5,hanmeimei,12,scl_addr:xizhimen
6,baby,3,food,addr:tianjing
hadoop 上傳源資料檔案到 HDFS:
hadoop fs -mkdir -p /tmp/hive_data/psn
hadoop fs -put psn.txt /tmp/hive_data/psn/
建立 hive 外表:
use default;
CREATE EXTERNAL TABLE ext_psn(
id INT comment 'ID',
name STRING comment '姓名',
age INT comment '年齡',
likes ARRAY<STRING> comment '愛好',
address MAP<STRING,STRING> comment '地址'
)comment '人員資訊表'
ROW FORMAT DELIMITED
FIELDS TERMINATED BY ','
COLLECTION ITEMS TERMINATED BY '-'
MAP KEYS TERMINATED BY ':'
LINES TERMINATED BY '\n'
LOCATION '/tmp/hive_data/psn/';
建立 hive 內表:
CREATE TABLE inner_psn(
id INT comment 'ID',
name STRING comment '姓名',
age INT comment '年齡',
likes ARRAY<STRING> comment '愛好',
address MAP<STRING<STRING> comment '地址'
) comment '人員資訊表';
- 內表的資料預設存放到
/user/hive/warehouse/${db_name}.db/${table_name}
目錄下,若使用 default 資料庫,預設存放到/user/hive/warehouse/${table_name}
; - 內表建立時也可以指定
LOCATION
資料存放的位置,用於資料的讀取;不同的是外表LOCATION
是必須定義的選項,內表LOCATION
用於更改資料檔案的預設存放位置。
複製外表建立內表
如果外表建立之後均沒有問題,建立內表時可以直接複製外表內容。
- 只複製後設資料表,不復制資料:
CREATE TABLE <table_name> LIKE <existing_table_or_view_name>
; - 透過查詢建立內表都複製:
CREATE TABLE <table_name> AS SELECT <select_statement>;
切換外表為內表
ALTER TABLE <table_name> SET tblproperties('EXTERNAL' = 'FALSE')
清空表資料
TRUNCATE TABLE <table_name>