大資料離線---Hive的表操作介紹
阿新 • • 發佈:2018-12-13
這次我們主要針對hive的操作表做簡單的介紹:
- 託管表和外部表
- 分割槽和桶
這2個部分做簡介
Hive表格邏輯上有儲存的資料和描述表格中資料形式的相關元資料組成。資料一般儲存在HDFS上,也可以存放在本地檔案系統中。元資料存放在關係資料庫中。
1. 託管表和外部表
託管表
- hive會把資料移動到它的倉庫,這裡使用的是load的命令,把檔案系統的資料移動到hive的倉庫目錄,如果資料和表的結構不匹配,這裡是不會異常,在查詢的時候會出現null空值
//載入hdfs的資料,資料會移動到hive的表目錄下 create table managed_table(dummy string); load data inpath '/usr/tom/data.txt' into table manage_table; //載入本地的資料,增加了local的關鍵字,資料不會移動 create table managed_table(dummy string); load data local inpath '/usr/tom/data.txt' into table manage_table;
- 刪除表 drop drop table manage_table ; 會將表的元資料和表的資料一起刪除,會導致資料徹底丟失。而load是移動操作,而drop是刪除,所以這裡是託管表.
外部表
create external table external_table(dummy string)
location '/usr/tom/external_table';
load data inpath '/usr/tom/data.txt' into table manage_table;
- 使用exterbnal關鍵字以後,hive知道資料不由自己管理,因此不會把資料移動到自己的目錄。
- 在建立表的時候就聲明瞭表的位置,在建立外部表的時候,不會檢查外部檔案是否存在,因此建立資料可以推遲到建立表之後,在建立表的時候只是對外部資料的引用,因此drop命令只會刪除元資料的資訊。
分割槽和桶
hive把表組織成partition(分割槽),這是根據一個分割槽列的值對錶進行粗略的劃分機制,使用分割槽還可以加快資料分片的查詢速度。 表或者分割槽可以進一步分為桶,他會為資料提供額外的結構以獲得更高效的查詢。
分割槽
- 分割槽實際實在HDFS檔案系統對應的表文件夾下面建立對應名稱的資料夾,在我們通過分割槽查詢的時候,直接制定到對應的檔案所在目錄,實現快速的查詢。
- 一個表可以指定多個維度進行分割槽,他們回像樹形目錄結構一樣展開,先建立的分割槽更靠近根目錄。使用的關鍵字是 partitioned by
//建立表和分割槽 create table logs(ts string,line string)partitioned by (dt string,country string); //載入資料,這裡需要顯式的指定分割槽的值 load data local inpath 'input/hive/partitions/file1' into table logs partition (dt='2018-01-01',country='China'); //查詢 select dt,ts,line form logs where country='China';
- 在查詢的時候可以像執行正常的列那樣指定分割槽,查詢的時候會返回分割槽的值,但是實際只是讀取了檔名,對應的資料檔案並不存在。
分桶
把表組織成分桶有兩個理由:
-
可以獲得更高的查詢處理效率,桶為表增加了額外的資料結構,在表結構中添加了幾個列,連線在兩個相同列上劃分了桶的表,可以使用map端的連線高效的使用
-
在處理大規模資料的開發階段,可以分桶後再對應的列上試執行查詢。可以使取樣更高效。
分桶使用的關鍵字使 clustered by 指定分桶所用的列和要劃分桶的個數。
//建立分桶表
create table bucketed_users(id int,name string) clustered by (id) into 4 Buckets;
//建立分桶表,並按照id排序
create table bucketed_users(id int,name string) clustered by (id) sorted by (id ASC) into 4 Buckets;
//載入本地檔案
load data local inpath 'input/hive/partitions/file1' into table bucketed_users;
這裡會對值得雜湊結果除以分桶個數取餘,進行分配。
- 查詢的時候,需要將***hive.enforce.bucketing屬性設定為true***,使用下面的命令查詢
//查詢命令
insert overwrite table nba2 select * from nba2;
實際分桶的個數是和reduce任務的個數相同的,在執行查詢的時候,實際執行的是MR程式。