Primitive Types
Numeric Types
type | length | postfix | example |
TINYINT | 1-byte signed integer, - - | Y | 100Y |
SMALLINT | 2-byte signed integer, - | S | 100S |
INT|INTEGE | 4-byte signed integer, -2147483648 - 2147483647 | L | 100L |
BIGINT | 8-byte signed integer,-9223372036854775808 to 9223372036854775807 | ||
| 4-byte single precision floating point number | ||
| 8-byte double precision floating point number | ||
| Introduced in Hive 0.11.0 with a precision of 38 digits | ||
| same as DECIMAL, starting with Hive 3.0.0 | ||
DOUBLE PRECISION | alias for DOUBLE, only available starting with Hive 2.2.0 | ||
Data/Time Types
TIMESTAMP | Only available starting with Hive 0.8.0 | YYYY-MM-DD HH:MM:SS.fffffffff" (9 decimal place precision) |
DATE | Only available starting with Hive 0.12.0 | YYYY-MM-DD. |
INTERVAL | Only available starting with Hive 1.2.0 | |
timestamp with local time zone |
timestamp with loca time zone類型文法
tmestamp[(fractional_seconds_precisions)] with local zone
timestamp with local time zone 和timesatamp with time zone的最大差別就是,前者在使用者送出時間給資料庫的時,該類型會轉換成資料庫的時區來儲存資料,即資料庫儲存的時間是資料庫本地時區,當别的使用者通路資料庫時oracle會自動将該時間轉換成目前用戶端的時間。
DB 的date類型:Date(不含微妙級時間),Timestamp(不含時區,含微妙時間),Timestamp with timezone(保持client的timezone),Timestamp with local time zone(把client的timezone轉換成DB的timezone對應的時間)
String Types
STRING | ||
VARCHAR | between 1 and 65535 | |
CHAR | The maximum length is fixed at 255 | 定長 |
對于Hive的String類型相當于資料庫的varchar類型,該類型是一個可變的字元串,不過它不能聲明其中最多能存儲多少個字元,理論上它可以存儲2GB的字元數。
Primitive Types Demo
DROP TABLE IF EXISTS hive_primitive_data_types; CREATE TABLE hive_primitive_data_types ( c_integers_tinyint TINYINT, c_integers_smallint SMALLINT, c_integers_int INT, c_integers_integer INTEGER, c_integers_bigint BIGINT, c_boolean BOOLEAN, c_float FLOAT, c_double DOUBLE, c_decimal DECIMAL, c_string STRING, c_varchar VARCHAR(65535), c_char CHAR(10) COMMENT '總長度255,固定長度', c_timestamp TIMESTAMP, --c_timestamp_2 timestamp with local time zone, c_date DATE, c_binary BINARY );
insert into table hive_primitive_data_types select 1,1,1,1,1,'true',1.1,1.11,1.111,'1','1','1',cast(current_date() as timestamp),cast(current_date() as date),cast('1' as binary); insert into table hive_primitive_data_types select 2,2,2,2,2,'true',2.2,2.22,2.222,'2','2','2',cast(current_timestamp() as timestamp),current_date(),cast('2' as binary);
![](https://img.laitimes.com/img/9ZDMuAjOiMmIsIjOiQnIsISPrdEZwZ1Rh5WNXp1bwNjW1ZUba9VZwlHdsATOfd3bkFGazxCMx8VesATMfhHLlN3XnxCMwEzX0xiRGZkRGZ0Xy9GbvNGLpZTY1EmMZVDUSFTU4VFRR9Fd4VGdsYTMfVmepNHLrJXYtJXZ0F2dvwVZnFWbp1zczV2YvJHctM3cv1Ce-cmbw5SYihTO1AjY3ImYhV2Y0AjNkFjZmBDMxEmZ0IWYzIDNj9CXyAzLchDMxIDMy8CXn9Gbi9CXzV2Zh1WavwVbvNmLvR3YxUjL1M3Lc9CX6MHc0RHaiojIsJye.png)
Complex Types
類型解釋
ARRAY | ARRAY<data_type> | 編号從零開 |
MAP | | |
STRUCT | STRUCT<col_name : data_type [COMMENT col_comment], ...> | |
UNIONTYPE | UNIONTYPE<data_type, data_type, ...> |
Hive有四種複雜資料類型ARRAY、MAP 和 STRUCT。ARRAY和MAP與Java中的Array和Map類似,而STRUCT與C語言中的Struct類似,它封裝了一個命名字段集合,複雜資料類型允許任意層次的嵌套。
- uniontype可以了解為泛型
- 同一時刻同一地點隻有聯合體中的一個元素生效
- uniontype中的元素共享記憶體
- 可以通過create_union内置函數建立uniontype:create_union(tag, val1, val2) tag是數字,0開始,必須小于後面參數的個數
- 插入uniontype資料,通過這種方式隻能插入隻有一個元素的uniontype,包含多個會提示跟表中的字段類型不一緻,這個是坑的地方
建立表
DROP TABLE IF EXISTS hive_complex_data_types; CREATE TABLE hive_complex_data_types ( c_array ARRAY<STRING>, c_map MAP<STRING,STRING>, c_struct STRUCT<province:STRING,city:STRING,area:STRING>, c_union UNIONTYPE<STRING,STRING> ) ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t' COLLECTION ITEMS TERMINATED BY '_' MAP KEYS TERMINATED BY ':' LINES TERMINATED BY '\n' ;
ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t':字段分割
COLLECTION ITEMS TERMINATED BY '_':集合分割
MAP KEYS TERMINATED BY ':':map的key,value分割
LINES TERMINATED BY '\n':行分割
導入資料
load data local inpath '/liuduo/data.txt' into table hive_complex_data_types;
cat data.txt 廣州_深圳 城市:廣州 廣東_廣州_白雲 廣州深圳 北京_上海 城市:上海 上海_上海_徐彙 北京上海
查詢資料
select c_array[0],c_array[1], c_map['城市'], c_struct.province,c_struct.city,c_struct.area, c_union from hive_complex_data_types;
類型轉換
Hive的原子資料類型是可以進行隐式轉換的,類似于Java的類型轉換,例如某表達式使用INT類型,TINYINT會自動轉換為INT類型,但是Hive不會進行反向轉化,例如,某表達式使用TINYINT類型,INT不會自動轉換為TINYINT類型,它會傳回錯誤,除非使用CAST操作。
隐式類型轉換規則如下(1)任何整數類型都可以隐式地轉換為一個範圍更廣的類型,如TINYINT可以轉換成INT,INT可以轉換成BIGINT。(2)所有整數類型、FLOAT和STRING類型都可以隐式地轉換成DOUBLE。(3)TINYINT、SMALLINT、INT都可以轉換為FLOAT。(4)BOOLEAN類型不可以轉換為任何其它的類型。