HIVE數據類型

HIVE中數據類型分爲數值類型、字符串類型、日期類型、複合類型以及其餘類型。下面分別進行介紹。數據結構

數值類型(7種)

數值類型相似於JAVA中的基本數據類型spa

clipboard.png

  • 整型數值默認按照INT處理,浮點數值默認按照DOUBLE處理。
  • 特殊狀況:整型數值超出INT範圍、數值後加Y/S/L後綴時,發生向其餘整型類型的轉換
  • Hive-0.11.0和Hive-0.12.0固定了DECIMAL類型的精度並限制爲38位數字,從Hive-0.13.0開始能夠指定DECIMAL的規模和精度,當使用DECIMAL類型建立表時能夠使用DECIMAL(precision,scale)語法。DECIMAL默認爲DECIMAL(10,0)。 DECIMAL類型比DOUBLE類型爲浮點數提供了精確的數值和更廣的範圍,DECIMAL類型存儲了數值的精確地表示,而DOUBLE類型存儲了很是接近數值的近似值。當DOUBLE類型的近似值精度不夠時能夠使用DECIMAL類型,好比金融應用,等於和不等於檢查以及舍入操做,當數值超出了DOUBLE類型的範圍(< -10^308 or > 10^308)或者很是接近於0(-10^-308 < ... < 10^-308)時,也能夠使用DECIMAL類型。

字符串類型

  • 字符串常量使用單引號或者雙引號表示.VARCHAR的長度指示器範圍爲1~65535,若是值長度超過定義長度,該字符串會被自動截斷。
  • CHAR的長度是固定的,不足部分使用空格補足。CHAR的長度指示器範圍爲1~255

日期類型

  • HIVE中提供DATE類型描述年月日,格式爲yyyy-MM-dd。 範圍爲0000.01.01~9999.12.31。
  • HIVE中提供TIMESTAMP類型描述細緻時間類型,格式yyyy-MM-dd HH:mm:ss.fffffffff, 小數後爲九位,也就是說精度爲納秒級別。
hive> select * from ts;
OK
1    2018-08-21 11:12:13.1
2    2018-08-21 11:12:13.123
3    2018-08-21 11:12:13.123456
4    2018-08-21 11:12:13.123456789
5    2018-08-21 11:12:13
6    NULL

若是load數據中的精度超出,則爲null, 但使用cast由string向timestamp轉換隻是會截取到最大精度,而不會爲null。好比:code

6,2019-09-09 09:09:09.1234567891

類型轉換

  • 個人文件內容
1,2018-08-21 11:12:13.1,2018-08-21,2018-08-21 11:12:13.1
4,2018-08-21 11:12:13.123456789,2018-08-21,2018-08-21 11:12:13.123456789
5,2018-08-21 11:12:13,2018-08-21,2018-08-21 11:12:13
6,2019-09-09 09:09:09.1234567891,2018-08-21,2019-09-09 09:09:09.1234567891
  • 個人ts表
hive> desc ts;
OK
id                      int                                         
ts                      timestamp                                   
date                    date                                        
dstring                 string                                      
Time taken: 0.062 seconds, Fetched: 4 row(s)
  • load data後表內容
hive> select * from ts;
OK
1    2018-08-21 11:12:13.1    2018-08-21    2018-08-21 11:12:13.1
4    2018-08-21 11:12:13.123456789    2018-08-21    2018-08-21 11:12:13.123456789
5    2018-08-21 11:12:13    2018-08-21    2018-08-21 11:12:13
6    NULL    2018-08-21    2019-09-09 09:09:09.1234567891
Time taken: 0.054 seconds, Fetched: 4 row(s)

timestamp -> string

select cast(ts as String) from ts;

2018-08-21 11:12:13.1
2018-08-21 11:12:13.123456789
2018-08-21 11:12:13
NULL

timestamp -> date

select cast(ts as date) from ts;

2018-08-21
2018-08-21
2018-08-21
NULL

date -> string

select cast(date as string) from ts;

2018-08-21
2018-08-21
2018-08-21
2018-08-21

date -> timestamp

select cast(date as timestamp) from ts;

2018-08-21 00:00:00
2018-08-21 00:00:00
2018-08-21 00:00:00
2018-08-21 00:00:00

string -> timestamp

select cast(dstring as timestamp) from ts;

2018-08-21 11:12:13.1
2018-08-21 11:12:13.123456789
2018-08-21 11:12:13
2019-09-09 09:09:09.123456789

string -> date

select cast(dstring as date) from ts;

2018-08-21
2018-08-21
2018-08-21
2019-09-09

複合類型

Array:ARRAY<data_type>
Map:MAP<primitive_type, data_type>
Struct: STRUCT<col_name : data_type [COMMENT col_comment], ...>
Union:UNIONTYPE<data_type, data_type, ...>orm

建表

create table uniontab(arr array<string>, mp MAP<INT, string>, stru struct<name:string, age:int>, uni uniontype<int, double, string>) row format delimited fields terminated by ',' collection items terminated by '#' map keys terminated by ':' lines terminated by '\n';

hive> desc uniontab;
OK
arr                     array<string>                               
mp                      map<int,string>                             
stru                    struct<name:string,age:int>                        
uni                     uniontype<int,double,string>                        
Time taken: 0.073 seconds, Fetched: 4 row(s)

生成數據

插入union時使用create_union,其中第一個位置,指定使用的類型的index(從0開始),後面跟一個完整的union類型的數據結構ip

insert  into uniontab select array('d','e','f'), map(1,'zjx',2,'wly'), named_struct('name', 'wly', 'age', 17), create_union(2, 10, 10.0, '10.1') from ts limit 1;

select * from uniontab;

["a","b","c"]    {1:"zjx",2:"wly"}    {"name":"zjx","age":18}    {0:10}
["d","e","f"]    {1:"zjx",2:"wly"}    {"name":"wly","age":17}    {1:10.0}
["d","e","f"]    {1:"zjx",2:"wly"}    {"name":"wly","age":17}    {2:"10.1"}

查詢

struct類型至關於JAVA中的BEAN,能夠使用 「.」 來操做其中的屬性ci

select stru.age from uniontab;
18
17
17

select mp[1] from uniontab;
zjx
zjx
zjx

select uni from uniontab;
{0:10}
{1:10.0}
{2:"10.1"}

轉化關係表

clipboard.png

相關文章
相關標籤/搜索