hive[3] 數(shù)據(jù)類型和文件格式Hive 支持關(guān)系型數(shù)據(jù)庫中的大多數(shù)據(jù)基本數(shù)據(jù)類型,同時也支持3種集合類型;3.1 Hive 的基本數(shù)據(jù)類型支持多種不同他度的整形和浮點型數(shù)據(jù)類型,具體如下(全都是保留字):tinyint 1byte 有符號整數(shù)smalint 2byte有符號號數(shù)int 4byte有符號號數(shù)bigint 8byte有符號號數(shù)boolean 布爾類型, true 或者 falsefloat 單精度浮點數(shù)double 雙精度浮點數(shù)string 字符串timpstamp 整數(shù),浮點數(shù)或字符串binary 字節(jié)數(shù)組需要注意的是:這些都是java 中的接口的實現(xiàn),因此這些類型的具體行為細節(jié)和java中對應的類型是完全一致的;如果用戶在查詢中將一個 float 類型列和一個 double 類型的列作對經(jīng),Hive 會隱式的將類型轉(zhuǎn)換為兩個類型中較大的那個類型;cast (s AS INT) 將 s 轉(zhuǎn)換成 int 類型3.2 集合數(shù)據(jù)類型Hive 中的列支持使用 struct、map、array 集合數(shù)據(jù)類型,例:STRUCT 列類型為struct{first STRING,last STRING} 如: struct('john','Doe')MAP 是一組鍵值對集合 字段名[last]獲取值 如:map('first','Join','last','Doe')ARRAY是具有相關(guān)同類型和名稱的變量的集合['John','Doe'] 如:Array(['John','Doe'])例如:員工關(guān)系表CREATE TABLE employees(name STRING, --名稱salary float, --薪水subordinates array<string>, --下屬員工deductions map<string,float>, --發(fā)薪水時從工工資中扣除掉的內(nèi)容(如:稅收 ,社保,公積金等)address struct<street:string,city:string,stat:string,zip:int> --員工家庭地址)3.3 文本文件數(shù)據(jù)編碼以逗號分隔值(CSV)或以制表符分隔值(TSV)文件;缺點,就是文件中那些不需要作為分隔符處理的逗號或者制表符要小心使用;Hive 中默認的記錄和字段分隔符:/n 文本文件的換行符^A 分隔字段(列),在 CREATE TABLE 語句中可以使用八進制編碼(/001)表示^B 分隔 ARRAY 或者 STRUCT 中的元素,或用于 MAP 中鍵值對之間的分隔,使用八進制編碼(/002)表示^C 用于 MAP 中鍵和值之間的分隔,使用八進制編碼(/003)表示也可以不使用這些默認的分隔符,而指定其他的分隔符,例如:CREATE TABLE employees( name STRING, salary FLOAT, subordinates ARRAY(STRING), deductions MAP(STRING,FLOAT), address STRUCT<street:STRING,city:STRING,state:STRING,zip:INT>)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 做關(guān)鍵字STORED AS TEXTFILE; --此句很少被用到注意:到目錄前為止 Hive 對于 linesterminated by 公支持 /n 也就是說行與行之間分隔符只能是 /nHive 還支持其他類型的文本格式,15節(jié)課再細說定義一個表是按照逗號來分隔:create table some_data(fistr float, second float, third float) row format delimited fileds terminated by ',';3.4 讀時模式Hive 在數(shù)據(jù)寫入數(shù)據(jù)庫時不會對對模式進行檢查,也不會在數(shù)據(jù)加載時進行驗證,而是在查詢時進行,也就是讀取時模式;如果模式和文件內(nèi)容并不匹配,每行記錄中的字段個數(shù)少于對應的模式中定義的字段個數(shù)的話,那么用戶將會看到查詢結(jié)果中有很多 null 值 ;如果某些字段是數(shù)值型的,但Hive 在讀取的時候發(fā)現(xiàn)存在非數(shù)值型的字符串值的話,將返回 null 值,除此情況 Hive 會將極力嘗試盡可能地將錯誤恢復過來;