Hive使用02 關鍵概念

2021-09-26 14:31:53 字數 3103 閱讀 2603

hive sql 是hive 使用者使用hive 的主要工具。hive sql 是類似於ansi sql 標準的sql 語言,但兩者又不完全相同。hive sql 和mysql 的sql 方言最為接近,但兩者之間也存在顯著差異,比如hive 不支援行級資料插人、更新和刪除,也不支援事務等。

hive 中的資料庫從本質上來說僅僅是乙個目錄或者命名空間,但是對於具有很多使用者和組的集群來說,這個概念非常有用。首先,這樣可以避免表命名衝突;其次,它等同於關係型資料庫中的資料庫概念,是一組表或者表的邏輯組

hive 中的表( table )和關聯式資料庫中的table 在概念上是類似的,每個table 在hive中都有乙個相應的目錄儲存資料,如果沒有指定表的資料庫,那麼hive 會通過{hive_home} /conf/hive-site且nl 配置檔案中的hive.metastore .warehouse. dir 屬性來使用預設值(一般是/user/hive/warehouse ,也可以根據實際的情況來修改這個配置),所有的table 資料(不包括外部表) 都儲存在這個目錄中。

hive 表分為兩類,即內部表和外部表。

a.內部表:

所謂內部表(managed table) hive 管理的表,hive 內部表的管理既包含邏輯以及語法上的,也包含實際物理意義上的,即建立hive 內部表時,資料將真實存在於表所在的目錄內,刪除內部表時,物理資料和檔案也一併刪除。

b.外部表:

外部表( external table )其管理僅僅是在邏輯和語法意義上的,即新建表僅僅是 指向乙個外部目錄而已。同樣,刪除時也並不物理刪除外部目錄,而僅僅是將引用和定義 刪除。

【案例】

考慮下面的語句:

create table my .... managed_table(coll string);

load data inpath 』/user/root/test_data.txt' into table my managed table

上述語句會將hdfs://user/root/data且t 移動到hive 的對應目錄hdfs://user/hive/warehouse/managed_ table 。但是載入資料的速度非常快,因為hive 只是把資料移動到對應的目錄,不會對資料是否符合定義的schema 做校驗,這個工作通常在讀取的時候進行(即為schemaon read ) 。同時, my_rnanaged_table 使用drop 語句刪除後,其資料和表的元資料都被刪除,不再存在, 這就是hive managed 的意思:drop table my_managed_table;

外部表則不一樣,資料的建立和刪除完全由自己控制, hive 不管理這些資料。資料的位置在建立時指定:

create external table external_table (dummy string)

location '/user/root/external table';

load data inpath '/user/root/data.txt 』工nto table external table;

指定external 關鍵字後,因而不會把資料移動到warehouse 目錄中。事實上, hive甚至不會校驗外部表的目錄是否存在。這使得我們可以在建立表之後再建立資料。當刪除外部表時, hive 只刪除元資料,而不會刪除外部實際物理檔案。

如果資料的所有處理都在hive 中進行,那麼更傾向於選擇內部表。但是如果hive 和其他工具針對相同的資料集做處理,那麼外部表更合適。一種常見的模式是使用外部表訪問儲存的hdfs (通常由其他工具建立)中的初始資料,然後使用hive 轉換資料並將其結果放在內部表中。相反,外部表也可以用於將hive 的處理結果匯出供其他應用使用。

hive 將表劃分為分割槽( partition), partition 根據分割槽字段進行。分割槽可以讓資料的部分查詢變得更快。表或者分割槽可以進一步被劃分為桶( bucket ) 。桶通常在原始資料中加人一些額外的結構,這些結構可以用於高效查詢。例如,基於使用者id 的分桶可以使基於使用者的查詢非常快。

假設日誌資料中,每條記錄都帶有時間戳。如果根據時間來分割槽,那麼同一天的資料將被劃分到同乙個分割槽中。針對每一天或者某幾天資料的查詢將會變得很高效,因為只需要掃瞄對應分割槽的檔案。分割槽並不會導致跨度大的查詢變得低效。分割槽可以通過多個維度來進行。例如,通過日期劃分之後,還可以根據國家進一步劃分。

分割槽在建立表的時候使用partitioned by 從句定義,該從句接收乙個字段列表:

create table logs (ts big int , line string) 

partitioned by (dt string,country string);

當導人資料到分割槽表時,分割槽的值被顯式指定:

load data inpath 』/user/root/path 』

into table logs

partition(dt='2001-01-01',country='gb 』);

在表或者分割槽中使用桶通常有兩個原因:

一是為了高效查詢。桶在表中加入了特殊的結果, hive 在查詢的時候可以利用這些結構提高效率。例如,如果兩個表根據相同的字段進行分桶,則在對這兩個表進行關聯的時候,可以使用map-side 關聯高效實現,前提是關聯的字段在分桶字段**現。

二是可以高效地進行抽樣。在公升析大資料集時,經常需要對部分抽樣資料進行觀察和分析,分桶有利於高效實現抽樣。

為了讓hive 對錶進行分桶,通過clustered by 從句在建立表的時候指定:

create table bucketed users(id int, name string)

clustered by (id) into 4 buckets;

指定表根據id 字段進行分桶,並且分為4 個桶。分桶時, hive 根據字段雜湊後取餘數來決定資料應該放在哪個桶,因此每個桶都是整體資料的隨機抽樣。在map-side 的關聯中,兩個表根據相同的宇段進行分桶,因此處理左邊表的bucket時,可以直接從外表對應的bucket 中提取資料進行關聯操作。map-side 關聯的兩個表不一

定需要完全相同bucket 數量,只要成倍數即可。

Hive常用函式02

select size citys from test where privince guangdong test 表中 privince是guangdong這一行的citys的大小 select map keys citys from test where privince guangdong t...

Hive核心概念

基於 hadoop 的乙個資料倉儲工具 hive本身不提供資料儲存功能,使用hdfs做資料儲存,hive也不分布式計算框架,hive的核心工作就是把sql語句翻譯成mr程式 hive也不提供資源排程系統,也是預設由hadoop當中yarn集群來排程 可以將結構化的資料對映為一張資料庫表,並提供 hq...

Hive相關概念

hive 基於hadoop之上的乙個離線資料倉儲,使用hdfs作為底層儲存,可以將結構化的資料檔案對映為一張資料庫表,並提供簡單的sql查詢功能,可以將sql語句轉換為mapreduce任務進行執行。hive主要分為以下幾個部分 1.使用者介面 使用者介面主要有三個 cli,client 和 web...