Hive 分區表 & 數據加載


1. Hive表數據的導入方式

1.1 本地上傳至hdfs

命令:

hdfs dfs -put [文件名] [hdfs絕對路徑]

 

例如:測試文件 test_001.txt 內容如下

 

 在 hdfs 絕對路徑:/user/hive/warehouse/mytest.db/ 下有一張表 test_001,建表語句如下:

create table test_001(id string, name string) row format delimited fields terminated by '\t';

 

使用如下命令將 test_001.txt 的內容上傳至 /user/hive/warehouse/mytest.db/test_001 表中

hdfs dfs -put test_001.txt /user/hive/warehouse/mytest.db/test_001

 

注意:

test_001.txt 文件內容中:數據類型、數據列數、列數之間的分隔符要與 hdfs 中 test_001 表定義的一一對應。

 

1.2 本地導入

命令:

load data local inpath [本地文件路徑] into table [表名];

示例:

load data local inpath '/user/xiaomin.liu/hive_testdata/student.csv' into table student;

含義:

將 /user/xiaomin.liu/hive_testdata 目錄下 student.csv 文件的內容加載至 hdfs 中的 student 表中。

 

注意:

1. student.csv 文件內容中:數據類型、數據列數、列數之間的分隔符要與 hdfs 中 student 表定義的一一對應。

2. 使用本地導入的方式加載數據至 hive,使用的是復制操作,即當本地路徑下的文件被加載至 hive 后,該本地路徑下的文件依然存在,不會消失。

 

1.3 hdfs導入

命令:

load data inpath [文件在hdfs中的路徑] into table [表名];

示例:

load data inpath '/user/warehouse/test/student.txt' into table student;

 

含義:

將 hdfs 路徑為 /user/warehouse/test 下的 student.txt 文件的數據加載至 hdfs 中的 student 表中。

注意:

使用 hdfs 導入數據至 hive,使用的是剪切操作,即原 hdfs 路徑下的文件在被導入至 hive 后,原 hdfs 路徑下的文件將不存在了。

 

1.4 覆蓋導入

本地導入命令:

load data local inpath [本地文件路徑] overwrite into table [表名];

hdfs導入命令:

load data inpath [hdfs文件路徑] overwrite into table [表名];

示例:

本地導入命令:

load data local inpath '/user/xiaomin.liu/hive_testdata/student.csv' overwrite into table student;

hdfs導入命令:

load data inpath '/user/warehouse/test/student.txt' overwrite into table student;

含義:

同1.2中的本地導入和1.3中的 hdfs 導入類似,只是新增的關鍵字 overwrite 會將表中已有的數據進行覆蓋操作。

 

1.5 查詢導入

命令:

create table [目標table_name] as select * from [已存在table_name];

示例:

create table sub_student as select * from student;

 

含義:將表 student 的結構與數據復制一份給到表 sub_student。

 

1.6 insert導入

追加模式命令:

insert into table [表名] select * from [已存在table_name];

 

示例:

insert into table sub_student select * from student;

含義:將表 student 的數據以 append 追加的方式寫入表 sub_student 中。

 

覆蓋模式命令:

insert overwrite table [表名] select * from [已存在table_name];

 

示例:

insert overwrite table sub_student select * from student;

含義:將表 student 的數據以覆蓋的方式寫入表 sub_student 中。

 

2. Hive 分區表操作

1.1 分區表的概念

Hive 中分區表的意思是按照表的某一列列名(1個字段)或某幾列列名(多個字段)作為類似文件夾的形式來隔離分開存放數據,以便提高檢索效率和管理效率。

例如:
公司要收集網站用戶登錄日志進行用戶數據行為分析,假設已存在 /user/login/warehouse/login_record 作為記錄登錄日志的存儲表,如果每天都將日志寫入該表,日積月累,login_record 表內容越來越多。

在查詢時進行全表掃描耗費的資源會非常多,等待的時間也會特別長。嚴重影響到了數據分析的效率。

在這種情況下,我們可以采用創建分區表的方法來創建 login_record 表,以日期對login_record 表進行分區,不同日期的日志信息存儲到不同的日期分區中。在查詢時可指定日期分區來進行查詢,可以有效提高查詢效率。

簡言之,分區表是指在系統上建立文件夾,把不同維度的分類數據放在不同文件夾下面,查詢時通過 where 子句過濾,只對指定目錄下的內容進行查詢,加快查詢速度。

 

1.2 分區表創建語法

分區表 hive sql 創建語句如下:

create table login_logs(l_id string, l_loginName string, l_date string) partitioned by (date string) row format delimited fields terminated by '\t';

 

分區表在創建時關鍵字是:partitioned by

括號里跟上分區字段名及其字段類型,這樣在創建表時就指明要創建的是一個分區表,上述創建語句說明要創建一個分區字段為:date,且類型為 string 類型的分區表,表名是 login_logs。

 

1.3 多分區表創建方式

多分區表 hive sql 創建語句如下:

create table login_logs(l_id string, l_loginName string, l_date string) partitioned by (year string, month string) row format delimited fields terminated by '\t';

與1.2中分區表創建語句的區別在於關鍵字 partitioned by 后面的參數是指定了多個分區字段,每個分區字段都需要指定字段類型,多字段之間以逗號分隔。

 

例如:
dws_test_001_daily_df 表有2個分區字段,分區字段分別是:dt,hotel。

hdfs多分區(文件夾)信息查詢:一級分區(文件夾)

 

命令:

hive>dfs -ls /user/hive/warehouse/dws.db/dws_test_001_daily_df;

上圖展示的是一級分區字段:dt,相當於一級文件夾。

hdfs多分區(文件夾)信息查詢:二級分區(文件夾)

命令:

hive>dfs -ls /user/hive/warehouse/dws.db/dws_test_001_daily_df/dt=2021-08-09;

 

 

上圖展示的是二級分區字段:hotel,相當於二級文件夾。

load 數據時可以指定分區來存儲目標數據,然后在查詢時 where 條件設置 dt 和 hotel 為指定目標值,則可達到縮小數據查詢范圍的目的,進而提高查詢效率。

 

1.4 查看分區數據

1.查看分區表數據

命令:

select * from login_logs where year='2021' and month='11';

查詢 sql 中以分區字段 year 和 month 作為 where 條件進行查詢,與普通的 mysql 語句在語法上沒有區別,但是在數據底層意義上差異較大,使用分區字段進行條件查詢,相當於在指定目錄:year='2021' 且 month='11' 下進行數據的搜索。

 

2.查看分區信息
命令:

show partitions dws.dws_test_001_daily_df partition(dt='2021-10-31');


上圖可以看出查詢結果為一級分區 dt=2021-10-31下所有二級分區 hotel 的信息。

 

1.5 分區表加載數據

分區表加載數據的方式與非分區表沒有本質區別,只是在語法上有些許變化,具體加載數據的方式可參考上方的 Hive 表數據的導入方式。


示例:
分區表從本地導入 hdfs 語法:

load data local inpath '/user/xiaomin.liu/hive_testdata/login_data.csv' overwrite into table login_logs partition(year='2021', month='10');

含義:

將本地的 login_data.csv 文件內容導入到 hdfs 中 login_logs 表的year='2021',month='10' 的分區中。

 

1.6 修改分區

命令:

ALTER TABLE table_name PARTITION (dt='2021-08-08') SET LOCATION "new location";
ALTER TABLE table_name PARTITION (dt='2021-08-08') RENAME TO PARTITION (dt='20210808');

 

1.7 添加分區

添加分區命令:

hive>alter table tmp_table add partition(dt="2021-12-01", hotel= "AAA");

 

插入數據命令:

hive>insert into tmp_table partition(dt="2021-12-01", hotel= "AAA") values('test_001', 100);


1.8 刪除分區

命令:

ALTER TABLE tmp_table DROP IF EXISTS PARTITION (dt="2021-12-01", hotel= "AAA");

 


小結:

  1. Hive 的分區相當於按文件夾對文件進行分類存儲,文件夾名可類比成分區字段名。
  2. 分區字段形式上存在於數據表中,在查詢時會顯示到客戶端上,但並不真正的存儲在數據表文件中,是所謂偽列。
  3. 因此,千萬不要以為是對屬性表中真正存在的列按照屬性值的異同進行分區。
  4. 比如上面的分區依據的列 year 和 month 並不真正的存在於數據表 login_logs 中,是我們為了方便管理添加的一個偽列,這個列的值也是我們人為規定的,不是從數據表中讀取之后根據值的不同將其分區。我們並不能按照某個數據表中真實存在的列,如 login_logs 表的字段 l_loginName 來分區。

 

歡迎關注【無量測試之道】公眾號,回復【領取資源】

Python+Unittest框架API自動化、

Python+Unittest框架API自動化、

Python+Pytest框架API自動化、

Python+Pandas+Pyecharts大數據分析、

Python+Selenium框架Web的UI自動化、

Python+Appium框架APP的UI自動化、

Python編程學習資源干貨、

資源和代碼 免費送啦~
文章下方有公眾號二維碼,可直接微信掃一掃關注即可。

備注:我的個人公眾號已正式開通,致力於IT互聯網技術的分享。

包含:數據分析、大數據、機器學習、測試開發、API接口自動化、測試運維、UI自動化、性能測試、代碼檢測、編程技術等。

微信搜索公眾號:“無量測試之道”,或掃描下方二維碼:

 

添加關注,讓我們一起共同成長!


免責聲明!

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



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