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 )其管理僅僅是在邏輯和語法意義上的,即新建表僅僅是 指向乙個外部目錄而已。同樣,刪除時也並不物理刪除外部目錄,而僅僅是將引用和定義 刪除。
考慮下面的語句:
上述語句會將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;create table my .... managed_table(coll string);
load data inpath 』/user/root/test_data.txt' into table my managed table
外部表則不一樣,資料的建立和刪除完全由自己控制, hive 不管理這些資料。資料的位置在建立時指定:
指定external 關鍵字後,因而不會把資料移動到warehouse 目錄中。事實上, hive甚至不會校驗外部表的目錄是否存在。這使得我們可以在建立表之後再建立資料。當刪除外部表時, hive 只刪除元資料,而不會刪除外部實際物理檔案。create external table external_table (dummy string)
location '/user/root/external table';
load data inpath '/user/root/data.txt 』工nto table external table;
如果資料的所有處理都在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 從句在建立表的時候指定:二是可以高效地進行抽樣。在公升析大資料集時,經常需要對部分抽樣資料進行觀察和分析,分桶有利於高效實現抽樣。
指定表根據id 字段進行分桶,並且分為4 個桶。分桶時, hive 根據字段雜湊後取餘數來決定資料應該放在哪個桶,因此每個桶都是整體資料的隨機抽樣。在map-side 的關聯中,兩個表根據相同的宇段進行分桶,因此處理左邊表的bucket時,可以直接從外表對應的bucket 中提取資料進行關聯操作。map-side 關聯的兩個表不一create table bucketed users(id int, name string)
clustered by (id) into 4 buckets;
定需要完全相同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...