hive的数据类型
1.1 基本类型
数据类型 | 大小 | 范围 | 示例 |
---|---|---|---|
TINYINT | 1byte | -128 ~ 127 | 100Y |
SMALLINT | 2byte | -32,768 ~ 32,767 | 100S |
INT/INTEGER | 4byte | -2,147,483,648 ~ 2,147,483,647 | 100 |
BIGINT | 8byte | -9,223,372,036,854,775,808 ~ 9,223,372,036,854,775,807 | 100L |
FLOAT | 4byte | 单精度浮点数 | 3.1415926 |
DOUBLE | 8byte | 双精度浮点数 | 3.1415926 |
DECIMAL | - | 高精度浮点数 | DECIMAL(9,8) |
BOOLEAN | - | 布尔型,TRUE/FALSE | true |
BINARY | - | 二进制类型 | - |
1.1.1 数字类型
整数类型
-2,147,483,648 ~ 2,147,483,647之间的整数类型默认是INT型,除非指定了格式100Y、100S、100L会自动转换为TINYINT、SMALLINT、BIGINT
浮点数类型
浮点数默认会当作DOUBLE型;
Hive中的DECIMAL基于Java中的BigDecimal,DECIMAL不指定精度时默认为DECIMAL(10,0);
hive中的BIGINT 基于 Java中的Long;
1.1.2 字符串类型
string
类型可以用单引号(')或双引号(")定义
varchar
varchar类型由长度定义,范围为1-65535,如果存入的字符串长度超过了定义的长度,超出部分会被截断。
char
char是固定长度的,最大长度255,而且尾部的空格不影响字符串的比较。
1.1.3 日期与时间戳
timestamp
timestamp表示UTC时间,可以是以秒为单位的整数;带精度的浮点数,最大精确到小数点后9位,纳秒级;java.sql.Timestamp格式的字符串 YYYY-MM-DD hh:mm:ss.fffffffff
Date
Hive中的Date只支持YYYY-MM-DD格式的日期,其余写法都是错误的,如需带上时分秒,请使用timestamp。
格式化timestamp/date/string 为字符串:
--当前日期格式化
select date_format(current_date(),'yyyy-MM-dd HH:mm:ss');
--当前时间格式化
select date_format(current_timestamp(), 'yyyy-MM-dd HH:mm:ss');
--字符串格式化
select date_format('2018-01-30 14:23:40', 'yyyy-MM-dd');
1.2 复杂类型
STRUCT(结构)
STRUCT类似于java的类变量使用,Hive中定义的struct类型也可以使用点来访问。从文件加载数据时,文件里的数据分隔符要和建表指定的一致。
struct(val1, val2, val3, ...) ,只有字段值;
named_struct(name1, val1, name2, val2, ...),带有字段名和字段值;
大表 --> STRUCT 字段保存了一张完整表的信息
person类 id name 有名字的结构 person
没有名字的结构 STRUCT
ARRAY
ARRAY表示一组相同数据类型的集合,下标从零开始,可以用下标访问。如:arr[0]
MAP
MAP是一组键值对的组合,可以通过KEY访问VALUE,键值之间同样要在创建表时指定分隔符。
如:map_col['name']
Hive除了支持STRUCT、ARRAY、MAP这些原生集合类型,还支持集合的组合,不支持集合里再组合多个集合。
1)构建dual表,用于仿Oracle的dual操作
create table dual(id int);
insert into table dual values(1);
-- dual表 oracle的dual表因为只有一行一列数据 所以可以通过查询这个表模拟执行函数返回一个值的过程
SQL 查询 select * from 表; 执行某个函数 结果 select 函数 from dual;(一行一列的数据) Oracle 数据库
select 函数;
2)创建带有复合结构的表
CREATE TABLE complex
(
id int,
struct_col struct<name:string,country:string>,
array_col array<STRING>,
map_col map<STRING,STRING>,
union_col map<STRING,array<STRING>>
)
ROW FORMAT DELIMITED FIELDS TERMINATED BY ','
COLLECTION ITEMS TERMINATED BY '-'
MAP KEYS TERMINATED BY ':';
--这个子句表明hive使用字符‘,’作为列分隔符
ROW FORMAT DELIMITED FIELDS TERMINATED BY ','
--这个子句表明hive使用字符 ‘-’ 作为集合元素间分隔符(一个字段各个item的分隔符)
COLLECTION ITEMS TERMINATED BY '-'
--这个子句表明hive使用字符作为map的键和值之间分隔符
MAP KEYS TERMINATED BY ':'
插入数据:
insert overwrite table complex
select
1,
NAMED_STRUCT('name','hainiu','country','cn') as struct_col,
array('99','21','33') as array_col,
map('english','aaaa') as map_col,
map('english',array('99','21','33')) as union_col;
用HQL查询
--查询struct
select struct_col.name from complex;--查询数组第一个元素
select array_col[0] from complex;--查询map中key对应的value值
select map_col['english'] from complex;--查询复杂结构map<STRING,array<STRING>>中key对应的value值
select union_col['english'] from complex;--查询复杂结构map<STRING,array<STRING>>中key对应的value值(数组)中的第一个元素
select union_col['english'][0] from complex;
上一篇: Hive的数据类型