赞
踩
本篇来学习一下Hive中的数据类型,以及如何在Hive SQL中去处理这些数据类型。
Hive的数据类型可以分为基本类型、字符串类型、日期与时间戳类型、集合类型,我们分别进行介绍:
Hive中的基本类型如下:
数据类型 | 大小 | 范围 | 示例 |
---|---|---|---|
TINYINT | 1byte | -128 ~ 127 | 100Y |
SMALLINT | 2byte | -32768 ~ 32767 | 100S |
INT | 4byte | -2^32~ 2^32-1 | 100 |
BIGINT | 8byte | -2^64~ 2^64-1 | 100L |
FLOAT | 4byte | 单精度浮点数 | 5.21 |
DOUBLE | 8byte | 双精度浮点数 | 5.21 |
DECIMAL | - | 高精度浮点数 | DECIMAL(9,8) |
BOOLEAN | - | 布尔型 | true/false |
BINARY | - | 字节数组 | - |
这里我们对DECIMAL类型做两点说明:
1)DECIMAL(9,8)代表最多9位数字,后8位是小数。此时也就是说,小数点前最多有1位数字,如果超过一位则会变成null。
2)如果不指定参数,那么默认是DECIMAL(10,0),即没有小数位,此时0.82会变成1。
这里我们通过一个SQL来进行说明:
创建表:
- create table if not exists
- datatype_test1(id int,col1 decimal,col2 decimal(9,8))
- row format delimited fields terminated by ',';
我们从txt中读取数据:
- load data local inpath '/Users/meituan_sxw/Downloads/test1.txt' into table datatype_test1;
-
-
- #txt中的内容
- 1,0.82,83.2
- 2,1.06,9.22
接下来查看hive中的数据:
select * from datatype_test1;
结果如下:
Hive中的字符串类型包含如下三种:
数据类型 | 长度 | 示例 |
---|---|---|
STRING | - | 'abc' |
VARCHAR | 1-65535 | 'abc' |
CHAR | 1-255 | 'abc' |
对于VARCHAR创建时需指定长度,如果插入的字符串超过了指定的长度,则会被截断,尾部的空格也会作为字符串的一部分,影响字符串的比较。
对于CHAR类型来说,它是固定长度的,如果插入的字符串长度不如指定的长度,则会用空格补齐。但是尾部的空格不影响字符串的比较。
接下来通过例子进行说明:
创建表:
- create table if not exists
- datatype_test2(id int,str_col string,varchar_col varchar(5),char_col char(5))
- row format delimited fields terminated by ',';
我们从txt中读取数据:
- load data local inpath '/Users/meituan_sxw/Downloads/test2.txt' into table datatype_test2;
-
-
- #txt中的内容
- 1,james harden,harden,harden
- 2,Westbrook,westbrook,westbrook
- 3,chris paul,paul,paul
接下来查看hive中的数据:
select * from datatype_test2;
结果如下:
再来看一下对于不同类型的字符串比较的例子,这里只需要注意第三行即可:
- select
- *,
- char_col='paul ',
- varchar_col='paul ',
- char_col='paul',
- varchar_col='paul'
- from
- datatype_test2;
结果如下:
可以看到,对于尾部的空格,并不影响char类型字符串的比较,但影响了varchar类型字符串的比较。
日期与时间戳类型主要有以下两种:
数据类型 | 格式 | 示例 |
---|---|---|
DATE | yyyy-MM-dd | 2020-07-04 |
TIMESTAMPS | yyyy-MM-dd HH:mm:ss.fffffffff | 2020-07-04 12:36:25.111 |
接下来做两点说明:
1)DATE类型只支持yyyy-MM-dd格式的数据,其余格式都是错误的,会变为NULL
2)TIMESTAMPS表示UTC时间,格式为yyyy-MM-dd HH:mm:ss.fffffffff,即最多支持纳秒级,如果长度超出,则会变成NULL
接下来还是通过例子来说明:
创建表:
- create table if not exists
- datatype_test3(id int,date_col Date,timestamp_col timestamp)
- row format delimited fields terminated by ',';
我们从txt中读取数据:
- load data local inpath '/Users/meituan_sxw/Downloads/test3.txt' into table datatype_test3;
-
-
- #txt中的内容
- 1,2020-07-04,2020-07-04 13:20:23.22
- 2,20200704,2020-07-04 13:20:23.222222222
- 3,2020-07-04,2020-07-04 13:20:23.22222222222
接下来查看hive中的数据:
select * from datatype_test3;
结果如下:
Hive中集合类型主要包含三种:STRUCT、ARRAY、MAP。咱们来分别介绍。
STRUCT
STRUCT 即结构体,通过相关的不同类型的数据来描述一个数据对象
ARRAY
ARRAY表示一组相同数据类型的集合,下标从零开始,可以用下标访问
MAP
MAP是一组键值对的组合,可以通过KEY访问VALUE
通过例子来感受下上述三种类型的使用:
创建表:
- create table if not exists
- datatype_test4(
- id int,
- info struct<name:string,weight:double>,
- score array<Int>,
- info_map map<string,string>)
- row format delimited fields terminated by ','
- COLLECTION ITEMS TERMINATED BY ';'
- MAP KEYS TERMINATED BY ':';
可以看到,我们定义了三种不同的集合类型字段,并指定了集合类型的分隔符为";",即struct,array,以及map的不同kv之间用";"分割,同时定义了map的key和value之间用":"分割。
接下来,我们创建如下内容的txt文件:
- 1,文文;70,99;96;100,name:文文;country:china
- 2,毛毛;60,99;92;100,name:毛毛;country:koera
- 3,超超;65,99;96;100,name:超超;country:japan
倒入hive中并查看:
- load data local inpath '/Users/meituan_sxw/Downloads/test4.txt' into table datatype_test4;
-
-
- select * from datatype_test4;
结果如下:
接下来,进一步介绍不同类型的读取,首先是struct类型,可以通过"."来访问不同的内容:
- select
- info.name as name,
- info.weight as weight
- from
- datatype_test4;
-
-
- #输出
- 文文 70.0
- 毛毛 60.0
- 超超 65.0
对于Array类型,可以通过下标进行访问,下标从0开始:
- select
- info.name as name,
- score[0] as math,
- score[1] as chinese,
- score[2] as English
- from
- datatype_test4;
-
-
- # 输出
- 文文 99 96 100
- 毛毛 99 92 100
- 超超 99 96 100
对于Map类型,可以通过['key']来访问不同key的内容:
- select
- info_map['name'] as name,
- info_map['country'] as country
- from
- datatype_test4;
-
-
- #输出
- 文文 china
- 毛毛 koera
- 超超 Japan
集合类型还包括UNIONTYPE,这里不做介绍,感兴趣的同学可自行查阅相关资料。
1、https://www.jianshu.com/p/1c9263cc2f9a
2、https://segmentfault.com/a/1190000016125717?utm_source=tag-newest
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。