hive:數據表創建、導入、導出、刪除


image

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)分區表類型

靜態分區與動態分區的主要區別在於靜態分區是手動指定,而動態分區是通過數據來進行判斷

  1. 靜態分區
  2. 動態分區

5.分桶表

目的: 單個分區或者表中數據量越來越大,當分區不能更細粒度划分數據時,采用分桶技術將數據更細 力度的划分和管理

實質: 分桶是對分桶字段做hash 然后存到對應的文件中

作用:

  1. 提高join 查詢效率(表A的每個桶就可以和表B對應的桶直接join,而不用全表join)
  2. 方便抽樣

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表
  1. 刪除指定分區 :alter table table_name drop partition(partiton_name='value'))
-- 刪除指定分區
alter table emp_partition drop partition(dept_name = 'Sales');
  1. 刪除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所在的服務器上。

image

記錄上傳文件路徑

裝載
-- 裝載數據,指定剛剛上傳文件路徑
load data inpath '/user/xxxx/emp_data_lt200kb.txt' into table emp;
-- 查看數據
select * from emp;

與 emp 表結構,對應的文件emp_data_lt200kb.txt 如下

image

image

創建分區表

  • 創建分區表
-- 創建分區表,分區字段不能存在於字段列表中
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字段值即是路徑

image

  • 查看分區表
show partitions emp_partition;
-- 返回Done. 0 results.
1.靜態分區

手動增加一個名為'Finance'部門分區

alter table emp_partition add partition(dept_name='Finance');

image

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 數據


我是知識搬運工,把遇到喜歡的文章或對自己有用的知識保存下來。

如何把這些知識搬為已用呢?如何把這些知識提煉從而對自己產生價值?這是值得思考的一個問題。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM