天天看點

Apache Hive基礎

Apache Hive基礎

Hive優勢:

提供了一個簡單的優化模型

HQL類SQL文法,簡化MR開發

支援在不同的計算架構上運作

支援在HDFS和HBase上臨時查詢資料

支援使用者自定義函數、格式

成熟的JDBC和ODBC驅動程式,用于ETL和BI

穩定可靠(真實生産環境)的批處理

有龐大活躍的社群

Hive中繼資料管理

記錄資料倉庫中模型的定義

存儲在關系資料庫中

預設是Derby,輕量級内嵌SQL資料庫,Derby非常适合測試示範,存儲在.metastore_db目錄中

實際生産一般儲存在MySQL中,修改配置檔案hive-site.xml

Hcatalog

将Hive中繼資料共享給其他應用程式上

Hive架構體系

Apache Hive基礎

Hive Interface 指令視窗模式

有兩種工具:Beeline和Hive指令行(CLI)

有兩種模式:指令行模式和互動模式

指令行模式

Apache Hive基礎

互動模式

Apache Hive基礎

Hive工具操作

檢查Hive服務是否正常啟動

使用Hive:hive

使用beeline

虛拟機的URL

jdbc:hive2://localhost:10000/default

beeline -u :jdbc:hive2://localhost:10000/default"

Hive資料類型 - 原始資料

類似于SQL資料類型

Apache Hive基礎

Hive資料類型 - 複雜資料類型

ARRRAY:存儲的資料為相同的類型

MAP:具有相同類型的鍵值對

STRUCT:封裝了一些字段

Apache Hive基礎

Hive中繼資料結構

Apache Hive基礎

資料庫(database)

表的集合,HDFS中表現為一個檔案夾(預設在hive.metastore.warehouse.dir屬性目錄下)

create database if not exists myhivebook;
use myhivebook;
show databases;
describe database default; --more details than ’show’, such as location(--is comment)
alter database myhivebook set owner user dayongd;
drop database if exists myhivebook cascade;
           

表(Tables)

分為内部表和外部表

内部表(管理表)

HDFS中為所屬資料庫目錄下的子檔案夾

資料完全由Hive管理,删除表(中繼資料)會删除資料

外部表(External Tables)

資料儲存在指定位置的HDFS路徑中

Hive不完全管理資料,删除表(中繼資料)不會删除資料

建表語句

CREATE EXTERNAL TABLE IF NOT EXISTS employee_external (--IF NOT EXISTS可選,
如果表存在,則忽略
    name string,
    work_place ARRAY<string>,
    sex_age STRUCT<sex:string,age:int>,--列出所有列和資料類型
    skills_score MAP<string,int>,
    depart_title MAP<STRING,ARRAY<STRING>>
)
COMMENT 'This is an external table'--COMMENT可選
ROW FORMAT DELIMITED
FIELDS TERMINATED BY '|'--如何分隔列(字段)
COLLECTION ITEMS TERMINATED BY ','--如何分隔集合和映射
MAP KEYS TERMINATED BY ':'
STORED AS TEXTFILE--檔案存儲格式
LOCATION '/user/root/employee'; --資料存儲路徑(HDFS)
           

表操作 - 删除/修改表

删除表

DROP TABLE IF EXISTS employee [With PERGE];--With PERGE直接删除(可選),否則會放到 .Trash目錄
TRUNCATE TABLE employee; -- 清空表資料
           

修改表(Alter針對中繼資料)

ALTER TABLE employee RENAME TO new_employee;--修改表名,常用于資料備份
ALTER TABLE c_employee SET TBLPROPERTIES ('comment'='New name, comments');
ALTER TABLE employee_internal SET SERDEPROPERTIES ('field.delim' = '$’);
ALTER TABLE c_employee SET FILEFORMAT RCFILE; -- 修正表檔案格式
-- 修改表的列操作
ALTER TABLE employee_internal CHANGE old_name new_name STRING; -- 修改列名
ALTER TABLE c_employee ADD COLUMNS (work string); -- 添加列
ALTER TABLE c_employee REPLACE COLUMNS (name string); -- 替換列
           

Hive分區操作 - 定義分區

--建表時候定義分區
CREATE TABLE employee_partitioned(
    name string,
    work_place ARRAY<string>,
    sex_age STRUCT<sex:string,age:int>,
    skills_score MAP<string,int>,
    depart_title MAP<STRING,ARRAY<STRING>> )
PARTITIONED BY (year INT, month INT)--通過PARTITIONED BY 定義分區
ROW FORMAT DELIMITED
FIELDS TERMINATED BY '|'
COLLECTION ITEMS TERMINATED BY ','
MAP KEYS TERMINATED BY ':';
           

靜态分區操作

--ALTER TABLE 的方式添加靜态分區
--ADD添加分區,DROP删除分區
ALTER TABLE employee_partitioned ADD 
PARTITION (year=2019,month=3) PARTITION (year=2019,month=4); 

ALTER TABLE employee_partitioned DROP PARTITION (year=2019, month=4);
           

Hive分區操作 - 動态分區

使用動态區需要設定屬性`

--使用動态分區需進行設定
set hive.exec.dynamic.partition=true;
set hive.exec.dynamic.partition.modenonstrict;
           

動态分區設定方法

--insert方式添加動态分區
insert into table employee_partitioned partition(year, month)
select name,array('Toronto') as work_place,
named_struct("sex","male","age",30) as sex_age,
map("python",90) as skills_score,
map("r&d", array('developer')) as depart_title,
year(start_date) as year,month(start_date) as month
from employee_hr eh ;	
           

分桶抽樣(Sampling)

--随機抽樣基于整行資料
SELECT * FROM table_name TABLESAMPLE(BUCKET 3 OUT OF 32 ON rand()) s;

--随機抽樣基于指定列(使用分桶列更高效)
SELECT * FROM table_name TABLESAMPLE(BUCKET 3 OUT OF 32 ON id) s;

--随機抽樣基于block size
SELECT * FROM table_name TABLESAMPLE(10 PERCENT) s;
SELECT * FROM table_name TABLESAMPLE(1M) s;
SELECT * FROM table_name TABLESAMPLE(10 rows) s;
           

Hive視圖(Views)

視圖概述

通過隐藏子查詢、連接配接和函數來簡化查詢的邏輯結構

虛拟表,從真實表中選取資料

隻儲存定義,不存儲資料

如果删除或更改基礎表,則查詢視圖将失敗

視圖是隻讀的,不能插入或裝載資料

應用場景

将特定的列提供給使用者,保護資料隐私

查詢語句複雜的場景

Hive視圖操作指令:CREATE、SHOW、DROP、ALTER

CREATE VIEW view_name AS SELECT statement; -- 建立視圖
	-- 建立視圖支援 CTE, ORDER BY, LIMIT, JOIN, etc.
SHOW TABLES; -- 查找視圖 (SHOW VIEWS 在 hive v2.2.0之後)
SHOW CREATE TABLE view_name; -- 檢視視圖定義
DROP view_name; -- 删除視圖
ALTER VIEW view_name SET TBLPROPERTIES ('comment' = 'This is a view');
--更改視圖屬性
ALTER VIEW view_name AS SELECT statement; -- 更改視圖定義, 
           

Hive側視圖(Lateral View)

常與生成函數結合使用,将函數的輸入和輸出連接配接

--OUTER關鍵字:即使output為空也會生成結果
select name,work_place,loc from employee lateral view outer explode(split(null,',')) a as loc;
--支援多層級
select name,wps,skill,score from employee 
lateral view explode(work_place) work_place_single as wps
lateral view explode(skills_score) sks as skill,score;
--通常用于規範化行或解析JSON