0.創建刪除數據庫
create Database if not Exists Hivetest;
use Hivetest;
1.數據類型
數字類 | 日期時間 | 字符串 | Misc類 | 復合類 | |
---|---|---|---|---|---|
整型 | Tinyint,Smallint,Int,Bigint,長度分別1,2,4,8字節 | ||||
浮點型 | Float,Double,Decimal長度分別4,8,...字節 | ||||
日期時間 | TimeStamp-時間戳,Date日期格式yyyy-mm-dd,interval-時間間隔 | ||||
字符串 | string字符串,Varchar長度不固定字符串,Char長度固定字符串 | ||||
Misc類 | Boolean布爾型,Binary字節型 | ||||
復合類 | ARRAY數組array<datatype>,MAP字典MAP<key_type,value_type>,Struct結構體Struct<col_name:date_type,col_name:data_type>,UnionType聯合體UnionType<date_type,date_type...> |
2.數據類型轉換
cast(列名 as 要轉換的類型)
convert(數據類型,列名)
3.分隔符
分隔符:Row fotmat delimited
字段分隔符:fields terminated by '分隔符'
復合類型元素分隔符: collection items terminated by '分隔符'
Map類型的key和value分隔符:map keys terminated by '分隔符'
記錄分隔符:lines terminated by '\\n'
4.分區表
1)分區表技術與意義
- 避免hive全表掃描,提升查詢效率。
- 減少數據冗余進而提高特定(指定分區)查詢分析的效率。
- 在邏輯上分區表與未分區表沒有區別,在物理上分區表會將數據按照分區鍵的列值存儲在表目錄的 子目錄中,目錄名為“分區鍵=鍵值”。
- 查詢時盡量利用分區字段。如果不使用分區字段,就會全部掃描。
2)分區表類型
靜態分區與動態分區的主要區別在於靜態分區是手動指定,而動態分區是通過數據來進行判斷
- 靜態分區
- 動態分區
5.分桶表
目的: 單個分區或者表中數據量越來越大,當分區不能更細粒度划分數據時,采用分桶技術將數據更細 力度的划分和管理
實質: 分桶是對分桶字段做hash 然后存到對應的文件中
作用:
- 提高join 查詢效率(表A的每個桶就可以和表B對應的桶直接join,而不用全表join)
- 方便抽樣
6.外部表與內部表
-- 有自動創建文件夾功能
create external table emp_external(
emp_no bigint,
first_name string,
last_name string,
gender string,
birth_date date,
from_date date,
dept_name string
)
ROW FORMAT DELIMITED
FIELDS TERMINATED BY '\t'
location '/user/xxxx/external_table/emp_external';
- 外部表內部表的區別
內部表 | 外部表 | |
---|---|---|
關鍵字 | external | |
位置 | hive\metastore\warehouse | Location 指定 |
數據 | Hive自身管理(刪除表直接刪除元數據、存儲數據) | HDFS管理(刪除表僅會刪除元數據,存儲數據並不會被刪除) |
7.數據導入
普通表:load data [local] inpath '數據文件路徑' [overwrite] into table 表名;
分區表:load data [local] inpath '數據文件路徑' [overwrite] into table 表名 [partition(分區字段='分區字段取值')];
insert into [table] 表名 [partition(分區字段[='分區字段取值'])]
insert overwrite table 表名 [partition(分區字段[='分區字段取值'])]
local: 指的是Liunx系統上的文件
overwrite: 關鍵字表示覆蓋原有數據,沒有此關鍵字表示添加數據
8.數據導出
INSERT OVERWRITE DIRECTORY '文件夾路徑' ROW FORMAT DELIMITED FIELDS TERMINATED by '字段分隔符' 查詢語句;
注意: OVERWRITE 把指定的文件夾重寫了 (一定要小心覆蓋掉有用的文件)
默認分隔符是用語句指定的,和本身建表語句指定的沒有關系
有新建文件夾功能
導出的文件都為000000_0命名
- 導出到HDFS
INSERT OVERWRITE DIRECTORY '/user/admin/out_data'
ROW FORMAT DELIMITED FIELDS TERMINATED by '\t'
select * from emp_pt;
9.數據刪除
刪除所有數據
使用truncate僅可刪除內部表數據,不可刪除表結構
truncate table 表名
-- 刪除內部數據
truncate table emp_pt;
使用shell命令刪除外部表數據(hdfs dfs -rm -r 外部表路徑)
-- 刪除外部表數據
-- hdfs dfs -rm -r /user/admin/external_table/emp_external/*
文件列表內直接刪除
刪除表部分數據
- 有partition表
- 刪除指定分區 :
alter table table_name drop partition(partiton_name='value'))
-- 刪除指定分區
alter table emp_partition drop partition(dept_name = 'Sales');
- 刪除partition內的部分信息(INSERT OVERWRITE TABLE)
INSERT OVERWRITE TABLE emp_partition partition(dept_name='Finance')
SELECT * FROM emp_partition
WHERE dept_name='Finance' and gender = "F";
重新把對應的partition信息寫一遍,通過WHERE 來限定需要留下的信息,沒有留下的信息就被刪除了。
- 無partiton表
INSERT OVERWRITE TABLE 表名 SELECT * FROM 表名 WHERE 條件;
Insert overwrite table emp_pt select * from emp_pt where gender = "F";
10.示例
創建普通表
- 創建普通表
create table if not exists emp(
userid bigint,
emp_name array<string>,
emp_date map<string,date>,
other_info struct<deptname:string, gender:string>)
row format delimited
fields terminated by '\t'
collection items terminated by ','
map keys terminated by ':';
三類分隔符指令都存在時,順序不能錯。
導入數據
我這里使用hue上傳,把本地文件傳入到hive所在的服務器上。
記錄上傳文件路徑
裝載
-- 裝載數據,指定剛剛上傳文件路徑
load data inpath '/user/xxxx/emp_data_lt200kb.txt' into table emp;
-- 查看數據
select * from emp;
與 emp 表結構,對應的文件emp_data_lt200kb.txt 如下
創建分區表
- 創建分區表
-- 創建分區表,分區字段不能存在於字段列表中
create table if not exists emp_partition(
emp_no bigint,
first_name string,
last_name string,
gender string,
birth_date date,
from_date date)
partitioned by (dept_name string)
row format delimited
fields terminated by '\t';
- 查看分區表所在路徑
show create table emp_partition;
-- localtion字段值即是路徑
- 查看分區表
show partitions emp_partition;
-- 返回Done. 0 results.
1.靜態分區
手動增加一個名為'Finance'部門分區
alter table emp_partition add partition(dept_name='Finance');
2.動態分區
根據數據自動創建多個分區,這里根據公司部門分區。
步驟:
1.創建一個普通表
2.向普通表里加載全部數據
3.把普通表的數據插入到分區表中
-- 1.創建一個普通表
CREATE TABLE emp_pt(
emp_no bigint,
first_name string,
last_name string,
gender string,
birth_date date,
from_date date,
dept_name string)
ROW FORMAT DELIMITED
FIELDS TERMINATED BY '\t';
-- 2.向普通表里加載全部數據
load data inpath '/user/xxxx/emp_data_PT2kb.txt' into table emp_pt;
-- 3.把普通表的數據插入到分區表中
-- 開啟動態分區開關
set hive.exec.dynamic.partition.mode=nonstrict
-- 通過insert語句自動分區
insert overwrite table emp_partition partition(dept_name) select * from emp_pt;
# 這里加上overwrite覆蓋之前手動增加的分區dept_name='Finance'
創建分桶表
- 創建分桶表
create table emp_bucket (
emp_no bigint,
first_name string,
last_name string,
gender string,
birth_date date,
from_date date,
dept_name string
)
clustered by(gender) into 2 buckets -- 為性別“男女”創建兩個分桶
ROW FORMAT DELIMITED
FIELDS TERMINATED BY '\t';
邏輯上分桶與否無差異,物理上每個桶為一個文件
裝載數據
分桶表裝載數據與普通表一致
-- 開啟分桶功能
set hive.enforce.bucketing=true
-- 忽略掉安全檢查
set hive.strict.checks.bucketing=false;
load data inpath '/user/xxx/emp_data_Sales.txt' into table emp_bucket;
hue 不支持像分桶表中Load data 數據
我是知識搬運工,把遇到喜歡的文章或對自己有用的知識保存下來。
如何把這些知識搬為已用呢?如何把這些知識提煉從而對自己產生價值?這是值得思考的一個問題。