Hive 學習筆記 一

2021-07-13 22:41:33 字數 3224 閱讀 3995

hive支援以下資料型別:

有符號整數: bigint(8 位元組),int(4位元組),smallint(2位元組)、tinyint(1位元組)

浮點數:float 、 double

boolean:flase、true

string

map:無序鍵值對。鍵的型別必須是原子的,值可以是任意型別,同乙個對映的鍵的型別必須相同,值的型別也必須相同

array: 有序列表,所有元素都必須是相同型別

struct:複雜型別,欄位的型別可以不同

hive提供了普通的sql操作,包括關係操作、算數操作以及邏輯操作。

hive也提供了很多內建函式,可以通過命令 show functions; 檢視。這些函式可以分成幾大類,包括數學和統計函式、字串函式、日期函式、條件函式、聚集函式以及處理xml和json的函式。

如果想知道某個函式的功用,可以通過命令查詢,如上。

hive的表在邏輯上有儲存的資料和描述表中資料形式的相關元資料組成。資料一般儲存在hdfs中,元資料存放在關係型資料庫中。

ps: 一般翻譯為 託管表和外部表

在hive中建立表時,預設情況下hive負責管理資料。這意味著hive把資料移入它的 「倉庫目錄」。另一種選擇是建立乙個「外部表」。這會讓hive到倉庫目錄以外的位置訪問資料。

建立託管表:

create

table users(id int,name string);

load data inpath '/user/hive/users' overwrite into

table users ;

建立表users,並把資料移動到 warehouse目錄下。

丟棄表:

drop

table users;

這個表的元資料和資料,會被一起刪除。

load 載入操作是檔案系統中的檔案移動或者檔案重新命名。hive並不檢查表目錄中的檔案是否符合未表所宣告的模式,如果有資料和模式不匹配,只有在查詢是才會知道。通常查詢時返回null時,表示字段缺失或者不匹配。

建立外部表:

create

external

table users(id int,name string)

row format delimited fields terminated by

','location '/user/hive/users' ;

load data inpath '/user/hadoop/users.txt'

into

table users ;

使用external 關鍵字,表示建立外部表。並且在建立時,hive並不會檢查這一外部位置是否存在。drop外部表時,hive只會刪除元資料。

使用分割槽可以加快資料分片的查詢速度。表或分割槽可以進一步分為bucket,可以未資料提供額外的結構以獲取更高效的查詢處理。

partition

以日誌檔案舉例:日誌檔案中每條記錄包含乙個時間戳。如果根據日期進行分割槽,那麼同一日期的記錄就會被存放在同乙個分割槽中。優點: 對於限制到某個或某些特定日期的查詢,處理將會更加高效。乙個表可以以多個維度進行分割槽。

分割槽是建立表時使用 partitioned by 定義。

create

external

table

ifnot

exists logs_static (

ip string,

status int)

partitioned by (year

int, month

int, day

int)

row format delimited fields terminated by

'\t'

location '/user/hadoop/logs/logs_static';

檢視表的描述:

在hdfs中,會建立如下檔案

查詢:

bucket

把錶或者分割槽組織成 桶有個理由。第乙個理由是獲得更高的查詢處理效率。第二個理由是可以使 取樣(sampling) 操作更加高效。

clustered by 定義如何劃分桶以及桶的個數。

create

table bucketed_users (id int, name string)

clustered by (id) sorted by (id asc) into

4 buckets;

這裡,使用id確定如何分桶(hive對值進行雜湊並將結果除以桶的個數取語數)。桶中的資料可以根據乙個或者多個列另外進行排序。這樣對每個桶的連線成了高效的 歸併排序,因此可以進一步提公升map端連線的效率。

將users表中的資料灌入 分桶表:

insert overwrite table bucketed_users

select * from users;

分桶完成後,hive會在hdfs上建立4個資料檔案。

查詢:

select * from bucketed_users tablesample(bucket 2 out of

2on id);

tablesample 表示對錶進行取樣。桶的個數從2開始計數,返回表中約1/2的資料行。因為查詢只需要讀取和tablesample 子句匹配的桶,所以取樣分桶表是非常高效的操作。如果使用rand() 函式對沒有劃分成桶的表進行取樣,即使只需要讀取很小一部分樣本,也要燒麥整個輸入資料集。

select * from users tablesample (bucket 1 out of

4on rand());

Hive學習筆記 Hive 引數

第一部分 hive 引數 hive.exec.max.created.files 說明 所有hive執行的map與reduce任務可以產生的檔案的和 預設值 100000 hive.exec.dynamic.partition 說明 是否為自動分割槽 預設值 false hive.mapred.re...

Hive學習筆記 Hive概述

1.1 資料倉儲 可以利用資料倉儲來儲存我們的資料,但是資料倉儲有別於我們常見的一般資料庫。資料倉儲是乙個面向主題的 整合的 不可更新的 隨時間不變化的資料整合,它用於支援企業或組織的決策分析處理。物件導向的 倉庫中的資料是按照一定的主題進行組織的。主題即使用者使用資料倉儲進行決策時所關心的重點方面...

hive學習筆記

在使用hive進行開發時,我們往往需要獲得乙個已存在hive表的建表語句 ddl 然而hive本身並沒有提供這樣乙個工具。要想還原建表ddl就必須從元資料入手,我們知道,hive的元資料並不存放在hdfs上,而是存放在傳統的rdbms中,典型的如mysql,derby等,這裡我們以mysql為元資料...