Hive中集合數據類型struct,map和array

Hive中的列支持使用struct,map和array集合數據類型。下表中的數據類型實際上調用的是內置函數。

Hive集合數據類型
數據類型 描述 字面語法示例
STRUCT 數據類型描述字面語法示例和C語言中的struct或者“對象”類似,都可以通過“點”符號訪問元素內容。例如,如果某個列的數據類型是 STRUCT { first STRING , last STRING} ,那麼第 1 個元素可以通過字段名.first來引用 struct('John','Doe')
MAP MAP 是一組鍵一值對元組集合,使用數組表示法(例如['key']) 可以訪問元素。例如,如果某個列的數據類型是 MAP ,其中鍵 值對是'first' -> 'John' 和'last' -> 'Doe',那麼可以通過字段名['last']獲取最後 1 個元素 map ('first','JOIN','last','Doe')
ARRAY 數組是一組具有相同類型和名稱的變量的集合。這些變量稱爲數組的元素,每個數組元素都有一個編號,編號從零開始。例如,數組值爲['John', 'Doe'] , 那麼第 2 個元素可以通過數組名[1]進行引用 Array('John','Doe')

 和基本數據類型一樣,這些類型的名稱同樣是保留字。

大多數的關係型數據庫並不支持這些集合數據類型,因此使用它們會趨向於破壞標準格式。例如,在傳統數據模型中,structs可能需要由多個不同的表拼裝而成,表間需要適當地使用外鍵來進行連接。

破壞標準格式所帶來的一個實際問題是會增大數據冗餘的風險,進而導致消耗不必要的磁盤空間,還有可能造成數據不一致,因此當數據發生改變時冗餘的拷貝數據可能無法進行相應的同步。

然而,在大數據系統中,不遵循標準格式的一個好處就是可以提高更高吞吐量的數據。當處理的數據的數量級是TB或者PB時,以最少的“頭部尋址”來從磁盤上掃描數據是非常必要的。按數據進行封裝的話可以通過減少尋址次數來提供查詢的速度。而如果根據外鍵關係關聯的話則需要進行磁盤間的尋址操作,這樣會有非常高的性能消耗。

建表:

create table jinyong(
name String,
salary float,
subs array<String>,
dedus Map<String,Float>,
KungFu struct<one:String,two:String,three:string,state:int>
) row format delimited
fields terminated by '\001'
collection items terminated by '\002'
map keys terminated by '\003'
lines terminated by '\n'
stored as textfile;
  • 其中,name是一個簡單的字符串,salary使用float浮
  • subs (代表小說完整名稱)列表是一個字符串值數組。在該數組中,我們可以認爲name是“主鍵”,因此subs中的每一個元素都將會引用這張表中的另一條記錄。對於沒有完整名稱的小說來說,這個宇段對應的值就是一個空的數組。在傳統的模型中,將會以另外一種方式來表示這種關係,比如員工和經理這種對應關係。這裏我們並非強調我們的模型對於Hive來說是最好的,而只是爲了舉例展示如何使用數組。
  • 字段dedus是一個由鍵-值對構成的map,其記錄了角色名稱和能力值。map中的鍵是角色的姓名,而且鍵可以是一個百分比值,也可以完全就是一個數值。在傳統數據模型 中,map的鍵可能存在於不同的表中。這些表在存放特定扣除額值的同時,還有一個外鍵指向對應的角色記錄。
  • 最後,每個角色的武功祕籍使用struct數據類型存儲,其中的每個域都被作了命名,並且具有一個特定的類型。

ROW FORMAT DELIMITED這組關鍵字必須要寫在其他子句(除了 STORED AS...子 句)之前。
字符\001 是AA 的八進制數。ROW FORMAT DELIMITED FIELDSTERMINATED BY '\001'這個子句表明Hive將使用^A字符作爲列分割符。

同樣地,字符\002 是AB 的八進制數。ROW FORMAT DELIMITEDCOLLECTION ITEMS TERMINATED BY '\002'這個子句表明Hive將使用T作爲集合元素間的分隔符。

最後,字符、003 是^C的八進制數。ROW FORMAT DELIMITEDMAP KEYS TERMINATED BY ’\003’這個子句表明Hive將使用AC作爲map的鍵和值之間的分隔符。子句 LINES TERMINATED BY '...'和 STORED AS …不需要 ROW FORMAT DELIMITED 關鍵字。

事實上,Hive到目前爲止對於LINESTERMINATEDBY...僅支持字符'\n',也就是 說行與行之間的分隔符只能爲‘\n’。因此這個子句現在使用起來還是有限制的。用戶可以重新指定列分割符及集合元素間分隔符,而map中鍵-值間分隔符仍然使用默 認的文本文件格式,因此子句STORED AS TEXTFILE很少被使用到。本書中大多數情 況下,我們使用的都是缺省情況下默認的TEXTFILE文件格式。

雖然用戶可以明確指定這些子句,但是在大多數情況下,大多子句還是使用默 認的分割符的,只需要明確指定那些需要替換的分隔符即可。

如下:vi jinyong_kf 文件編輯數據,內容如下:

編輯完成後上傳數據到jinyong表

hive (common)> load data local inpath '/otp/datas/jinyong_kf' into table jinyong;

完成後查詢數據

hive (common)> select * from jinyong;

這種強大的可定製功能使得可以很容易地使用Hive來處理那些由其他工具和各種各樣的ETL(也就是數據抽取、數據裝換、數據裝載過程)程序產生的文件。

 

 

飛雪連天射白鹿 笑書神俠倚碧鴛

感謝金庸帶給我們的武俠世界,您永遠活在我們心中!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章