1. 程式人生 > >大資料離線---Hive的表操作介紹

大資料離線---Hive的表操作介紹

這次我們主要針對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程式。