欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

hive的数据类型

程序员文章站 2022-07-14 14:34:34
...

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;