使用Hive之數據類型和文件格式

Hive支持RDBMS中的大多數數據類型,同時也支持RDBMS中很少支持的3中集合數據類型。

一、基本數據類型

1. Integers 整數型

TINYINT—1 byte integer

SMALLINT—2 byte integer

INT—4 byte integer

BIGINT—8 byte integer

以上這些都是有符號的整型。

2. Boolean type 布爾型

BOOLEAN—TRUE/FALSE

3. Floating point numbers 浮點型

FLOAT—single precision 單精度浮點

DOUBLE—Double precision 雙精度浮點

4. Fixed point numbers 定點型

DECIMAL—a fixed point value of user defined scale and precision

5. String types 字符序列

STRING—sequence of characters in a specified character set

VARCHAR—sequence of characters in a specified character set with a maximum length

CHAR—sequence of characters in a specified character set with a defined length

7. Date and time types 時間類型

TIMESTAMP—a specific point in time, up to nanosecond precision

DATE—a date

8. Binary types 字節數組

BINARY—a sequence of bytes

為什么有的字符類型很特殊呢? 這是因為所有這些數據類型都是對Java中的接口的實現,比如string類型實現的和Java中的string,float中也是對Java中的float。

但是其他RDBMS通常也會提供限制最大長度的字符數組,而在Hive中卻不會支持。因為處于性能優化的考慮,這些定長的記錄容易進行索引、掃描等。而在Hive強調優化磁盤讀寫的性能對限制列的長度相對來說不是很重要。

在Hive0.8.0以后的timestamp、binary數據類型數據類型;timestamp指可以為整數,也就是距離Unix新紀元的秒數;也可以是浮點數,距離到納秒(小數點后保留9位),也可以是字符串,即JDBC所約定的的字符串格式,比如:yyyy-mm-dd hh24:mi:ss.fffffffff。

binary類型和其他的RDBMS數據庫中的varbinary很類似。不過它并不和blob數據類型并不同。因為binary列存儲在記錄中,而blob不同。

當用戶查詢用到不同的浮點列對比是,比如將float和double列進行對比或一個整數列和另一種整數列對比時,Hive會怎么樣處理呢?遇到這種情況,Hive會隱式的將把數據類型轉換為兩個數據類型較大的那個處理,也就是將float轉換成double。

二、集合數據類型

Hive 中的列支持使用 struct、map、array 集合數據類型,如下:

STRUCT列類型為struct{first STRING,last STRING} ? ? 如: struct('john','Doe')

MAP是一組鍵值對集合 字段名[last]獲取值 ? ?如:map('first','Join','last','Doe')

ARRAY是具有相關同類型和名稱的變量的集合['John','Doe'] ? ?如:Array(['John','Doe']?)

大多數的關系型數據庫并不支持這些集合數據類型,這有破壞標準數據格式的危險。通常在RDBMS中的處理方式大概用主外鍵關聯。我們知道主外鍵關聯的話在進行TB級以上的數據處理時會造成性能的極大消耗。但在大數據庫架構中,這種設計卻有助于提高數據吞吐量。

例如:

CREATE TABLE employees(

name STRING,

salary float,

subordinates array<string>,

deductions map<string,float>,

address struct<street:string,city:string,state:string,zip:int>?

)

name --雇員名,salary --雇員薪水,subordinates --下屬員工,deductions --五險一金,個稅等,address --雇員的住址

很明顯,一個雇員表詳細信心存儲在一張表中,在RDBMS中則可能存在某個字段的信息存儲在另外一張表,通過主外鍵或查詢條件進行連接后獲取結果。這里可以通過一些集合數據類型進行處理了就。

三、文本文件的數據編碼

我們知道,一個文本文件如果需要進行數據處理,就需要對其中的格式進行定義,我們最熟悉的應該是以逗號或制表符分隔的文本格式CSV、TSV,當然在Hive中,這些文本格式都是被支持的。

那么Hive中還會支持其他什么控制字符的文本格式呢?

\n ? ? ? ? ? ? ? ? ? ? ? 換行符是可以支持的,因為每一行都可以被認為是一條記錄

^A(Ctrl+A) ? ? 分隔字段,在 CREATE TABLE 語句中可以使用八進制編碼(\001)表示

^B ? ? ? ? ? ? ? ? ? ? ?分隔 ARRAY 、MAP或者 STRUCT 中的元素,鍵值對之間的分隔,使用八進制編碼(\002)表示

^C ? ? ? ? ? ? ? ? ? ? ?用于 MAP 中鍵和值之間的分隔,使用八進制編碼(\003)表示

比如將一個特定格式的文件插入到employees庫中,文件打開后數據格式顯示如下:

Shkodran Mustafi^A5000^ALaurent Koscielny^BRobert Holding^BHector Bellerin^AFederal^C.2^BState Taxes^C.05^BInsurance^C.1^A 1 Michigan Ave.^BChicago^BIL^B60600

我們可以針對此文件進行分解,讓我們對格式更加清晰一些:

1、Shkodran Mustafi 對應 'name'字段,字段間用^A分割,所有在和salary字段之間的地方使用了^A。

2、5000對應’salary'字段,同樣的用^A 隔斷下一個字段。

3、Laurent Koscielny^BRobert Holding^BHector Bellerin 對應'subordinates'字段,針對array元素內的分割使用^B。

4、Federal^C.2^BState Taxes^C.05^BInsurance^C.1 對應‘deductions’字段,map元素內的分割使用^C。

5、1 Michigan Ave.^BChicago^BIL^B60600 對應‘address’字段,struct元素內的分割使用^B。

拆分后,是不是很清楚了呢?

也可以不使用這些默認的分隔符,而指定其他的分隔符,例如之前的表可以:

CREATE TABLE employees(

name STRING,

salary FLOAT,

subordinates ARRAY(STRING),

deductions MAP(STRING,FLOAT),

address ? ?STRUCT

)

ROW FORMAT DELIMITED--必須寫在下面的子句之前(stored as 除外)

FILEDS TERMINATED BY '\001'--Hive 將使用 ^A 做為列分隔符

COLLECTION ITEMS TERMINATED BY '\002'--表明Hive 將使用 ^B 做為集合元素間分隔符

MAP KEYS TERMINATED BY '\003'--表明Hive 將使用 ^C 做為 MAP 的鍵值之間的分隔符

LINES TERMINATED BY '\n'--下面這兩句表明不需要?ROW FORMAT DELIMITED 做關鍵字

STORED AS TEXTFILE;--此句很少被用到

另外,定義一個表是按照逗號來分隔的數據表可以這么來:

create table test_2(fistr float, second float, third float) row format delimited fileds terminated by ',';

雖然用戶可以自定義一些分隔符,但是大多數子句還是使用默認分隔符的,只需要指定明確替換的分隔符即可。所以Hive可以容易的使用由很多ETL工具或其他程序產生的文件。

四、讀時模式

當用戶向數據庫進行數據寫入時,可以采用外部裝載、update語句,或者查詢寫入。傳統數據庫時寫時模式,什么意思呢,即只在數據寫入時對模式進行檢查。

Hive對底層存儲沒有一些控制手段,對于要查詢的數據,有很多方式可以進行創建、修改或進行破壞。因此,hive不會在數據加載時才對模式進行驗證,而在查詢時就對其模式進行驗證,這是讀時模式。

如果模式和文件內容并不匹配,每行記錄中的字段個數少于對應的模式中定義的字段個數的話,那么用戶將會看到查詢結果中有很多 null 值 ;如果某些字段是數值型的,但Hive 在讀取的時候發現存在非數值型的字符串值的話,將返回 null 值。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,702評論 6 534
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,615評論 3 419
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 176,606評論 0 376
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,044評論 1 314
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,826評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,227評論 1 324
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,307評論 3 442
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,447評論 0 289
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,992評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,807評論 3 355
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,001評論 1 370
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,550評論 5 361
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,243評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,667評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,930評論 1 287
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,709評論 3 393
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,996評論 2 374

推薦閱讀更多精彩內容