本文參考Apache官網,更多內容請參考:https://cwiki.apache.org/confluence/display/Hive/LanguageManual+Types
1. 數值型
類型 | 支持范圍 |
---|---|
TINYINT | 1-byte signed integer, from -128 to 127 |
SMALLINT | 2-byte signed integer, from -32,768 to 32,767 |
INT/INTEGER | 4-byte signed integer, from -2,147,483,648 to 2,147,483,647 |
BIGINT | 8-byte signed integer, from -9,223,372,036,854,775,808 to 9,223,372,036,854,775,807 |
FLOAT | 4-byte single precision floating point number |
DOUBLE | 8-byte double precision floating point number |
DOUBLE | PRECISION |
DECIMAL | Decimal datatype was introduced in Hive 0.11.0 (HIVE-2693) and revised in Hive 0.13.0 (HIVE-3976) |
1. Integral Types (TINYINT, SMALLINT, INT/INTEGER, BIGINT)?
默認情況下,整數型為INT型,當數字大于INT型的范圍時,會自動解釋執行為BIGINT,或者使用以下后綴進行說明。
類型 | 后綴 | 例子 |
---|---|---|
TINYINT | Y | 100Y |
SMALLINT | S | 100S |
BIGINT | L | 100L |
INTEGER is introduced as a synonym for INT in Hive 2.2.0 (HIVE-14950).?
2. Decimals?
Hive的小數型是基于Java BigDecimal做的, BigDecimal在java中用于表示任意精度的小數類型。所有常規數字運算(例如+, - ,*,/)和相關的UDFs(例如Floor,Ceil,Round等等)都使用和支持Decimal。你可以將Decimal和其他數值型互相轉換,且Decimal支持科學計數法和非科學計數法。因此,無論您的數據集是否包含如4.004E + 3(科學記數法)或4004(非科學記數法)或兩者的組合的數據,可以使用Decimal。?
從Hive 0.13開始,用戶可以使用DECIMAL(precision, scale) 語法在創建表時來定義Decimal數據類型的precision和scale。 如果未指定precision,則默認為10。如果未指定scale,它將默認為0(無小數位)。
CREATE TABLE foo (?
a DECIMAL, – Defaults to decimal(10,0)?
b DECIMAL(9, 7)?
)
大于BIGINT的數值,需要使用BD后綴以及Decimal(38,0)來處理,例:
select CAST(18446744073709001000BD AS DECIMAL(38,0)) from my_table limit 1;
Decimal在Hive 0.12.0 and 0.13.0之間是不兼容的,故0.12前的版本需要遷移才可繼續使用,具體情況參見官網。
2. 日期型
類型 | 支持版本 |
---|---|
TIMESTAMP | Note: Only available starting with Hive 0.8.0 |
DATE | Note: Only available starting with Hive 0.12.0 |
INTERVAL | Note: Only available starting with Hive 1.2.0 |
1. Timestamps?
支持傳統的UNIX時間戳和可選的納秒精度。?
- 支持的轉化:?
- 整數數字類型:以秒為單位解釋為UNIX時間戳?
- 浮點數值類型:以秒為單位解釋為UNIX時間戳,帶小數精度?
- 字符串:符合JDBC java.sql.Timestamp格式“YYYY-MM-DD HH:MM:SS.fffffffff”(9位小數位精度)?
時間戳被解釋為無時間的,并被存儲為從Unix紀元的偏移量。 提供了用于轉換到和從時區轉換的便捷UDFs(to_utc_timestamp,from_utc_timestamp)。?
所有現有的日期時間UDFs(月,日,年,小時等)都使用TIMESTAMP數據類型。?
Text files中的時間戳必須使用格式yyyy-mm-dd hh:mm:ss [.f …]。 如果它們是另一種格式,請將它們聲明為適當的類型(INT,FLOAT,STRING等),并使用UDF將它們轉換為時間戳。?
在表級別上,可以通過向SerDe屬性”timestamp.formats”(自版本1.2.0 with HIVE-9298)提供格式來支持備選時間戳格式。 例如,yyyy-MM-dd’T’HH:mm:ss.SSS,yyyy-MM-dd’T’HH:mm:ss。?
2. Dates?
DATE值描述特定的年/月/日,格式為YYYY-MM-DD。 例如,DATE’2013-01-01’。 日期類型沒有時間組件。 Date類型支持的值范圍是0000-01-01到9999-12-31,這取決于Java Date類型的原始支持。?
Date types只能在Date, Timestamp, or String types之間轉換。
轉換類型 | 結果 |
---|---|
cast(date as date) | Same date value |
cast(date as string) | The year/month/day represented by the Date is formatted as a string in the form ‘YYYY-MM-DD’. |
cast(date as timestamp) | A timestamp value is generated corresponding to midnight of the year/month/day of the date value, based on the local timezone. |
cast(string as date) | If the string is in the form ‘YYYY-MM-DD’, then a date value corresponding to that year/month/day is returned. If the string value does not match this formate, then NULL is returned. |
cast(timestamp as date) | The year/month/day of the timestamp is determined, based on the local timezone, and returned as a date value. |
3. Intervals?
時間間隔在1.2.0之后版本支持,在2.2.0版本上進行了擴展,具體情況參見官網。
3. 字符型
1.Strings?
字符串文字可以用單引號(’)或雙引號(“)表示。Hive在字符串中使用C風格的轉義。?
2. Varchar?
Varchar類型使用長度說明符(介于1和65355之間)創建,它定義字符串中允許的最大字符數。 如果要轉換/分配給varchar值的字符串值超過length說明符,則字符串將被靜默截斷。 字符長度由字符串包含的代碼點的數量確定。?
像字符串一樣,尾部空格在varchar中很重要,并且會影響比較結果。?
非通用UDFs不能直接使用varchar類型作為輸入參數或返回值。 可以創建字符串UDFs,而varchar值將被轉換為strings并傳遞到UDF。 要直接使用varchar參數或返回varchar值,請創建GenericUDF。?
如果基于reflection-based方法來獲取數據類型信息,則可能存在不支持varchar的場景。 這包括一些SerDe函數實現。?
3. Char?
字符類型與Varchar類似,但它們是固定長度的,意味著比指定長度值短的值用空格填充,但尾隨空格在比較期間不重要。 最大長度固定為255。
CREATE TABLE foo (bar CHAR(10))
4. 其他
- BOOLEAN
- BINARY (Note: Only available starting with Hive 0.8.0)
所有這些數據類型都是對java中接口的實現,因為這些類型的具體行為細節和Java中對應的類型是完全一致的。例如,String類型實現的是java中的String,FLOAT實現的是java中的float,等等。
5. 復雜類型(集合數據類型)
Hive中的列支持使用struct,map和array集合數據類型。語法示例實際上調用的是內置函數。和基本數據類型一樣,這些類型同樣是保留字。
?
類型 | ? | 支持版本 |
---|---|---|
arrays | ARRAY(data_type) | Note: negative values and non-constant expressions are allowed as of Hive 0.14. |
maps | MAP(primitive_type, data_type) | Note: negative values and non-constant expressions are allowed as of Hive 0.14. |
structs | STRUCTcol_name : data_type [COMMENT col_comment], …) | ? |
union | UNIONTYPE(data_type, data_type, …) | Note: Only available starting with Hive 0.7.0. |
復雜類型包括ARRAY,MAP,STRUCT,UNION,這些復雜類型是由基礎類型組成的。
MAP:MAP包含key->value鍵值對,可以通過key來訪問元素。比如”userlist”是一個map類型,其中username是key,password是value;那么我們可以通過userlist['username']來得到這個用戶對應的password;
STRUCT:STRUCT可以包含不同數據類型的元素。這些元素可以通過”點語法”的方式來得到所需要的元素,比如user是一個STRUCT類型,那么可以通過user.address得到這個用戶的地址。
UNION: UNIONTYPE,他是從Hive 0.7.0開始支持的。
示例:一張虛構的人力資源應用程序中的員工表:
CREATE TABLE employees ( name STIRNG, salary FLOAT, subordinates ARRAY<STRING>, deductions MAP<STRING, FLOAT>, address STRUCT<street:STRING, city:STRING,state:STRING,zip:INT>);
?
說明:
subordinates 下屬員工,是個數組,
deductions 扣除額:是一個map,記錄每次的扣除額
address:雇員地址,使用struct數據類型存儲,其中每個城都被作了命名,并且具有一個特定類型。
集合類型也可以嵌套使用,類似如:ARRAY<STRUCT>表示數組中的每個元素都是STRUCT結構。
?
文本文件數據編碼
hive書用幾個很少出現在字段值中的控制字符,使用術語field來表示替換默認分隔符的字符
常使用分隔符
分隔符 | 名稱 | 說明 |
---|---|---|
\n | 換行符 | 對于文本文件而言,每一行是一條記錄,因此換行符可以分割數據。 |
^A | <Ctrl >+A | 常用于分隔列,在CREATE TABLE語句中可以使用八進制編碼\001表示。 |
^B | <Ctrl >+B | 常用于分隔ARRAY與STRUCT元素,或用于MAP中鍵值對之間的分隔。CREATE TABLE語句中可以使用八進制編碼\002表示 |
^C | <Ctrl +C> | MAP中鍵值對的分隔。 |
\t | 制表符 | 常用 |
, | 逗號 | 常用 |
在使用的過程中,可以不使用Hive提供的默認分隔符,而使用其他的分隔符。