您当前的位置: 首页 >  hive

Hive教程(04)- Hive数据类型

发布时间:2022-02-21 17:46:15 ,浏览量:5

文章目录
  • 01 引言
  • 02 hive数据类型
    • 2.1 基础类型
      • 2.1.1 整型
      • 2.1.2 浮点型
      • 2.1.3 文本型
      • 2.1.4 布尔及二进制
      • 2.1.5 时间类型
    • 2.2 复杂类型
      • 2.2.1 STRUCT
      • 2.2.2 ARRAY
      • 2.2.3 MAP
      • 2.2.4 UNION
    • 2.3 类型转换
      • 2.3.1 隐式转换
      • 2.3.1 显式转换
  • 03 文末
01 引言

在前面的教程,已经初步了解了Hive的数据模型,有兴趣的同学可以参阅:

  • 《Hive教程(01)- 初识Hive》
  • 《Hive教程(02)- Hive安装》
  • 《Hive教程(03)- Hive数据模型》

上一节写了hive数据模型,其实就是告诉我们使用hive可以把数据存放到hdfs的哪几种目录(表、分区、桶)。

既然知道了存储的目的地,那么我们总得知道要存的数据有什么特性,就是本文要将的hive数据类型。

02 hive数据类型 2.1 基础类型

HQL的基本类型和Java的基本类型很接近,分类如下:

类型 描述 示例 BOOLEN true/false TRUE TINYINT 1字节的有符号整数,范围:-128~127 1Y SMALLINT 2字节的有符号整数,范围:-32768~32767 1S INT 4字节的带符号整数 1 BIGINT 8字节带符号整数 1L FLOAT 4字节单精度浮点数1.0 DOUBLE 8字节单精度浮点数 1 DEICIMAL 任意精度的带符号小数 1 STRING 字符串,变长 “a” VARCHAR 变长字符串 “a” CHAR 固定长度字符串 “a” BINARY 字节数组 TIMESTAMP 时间戳,纳秒精读 1.22327E+11 DATE 日期 ‘2022-02-21’ 2.1.1 整型

在使用整数字面量时,默认情况下为INT,如果要声明为其他类型,通过后缀来标识。 在这里插入图片描述

2.1.2 浮点型

在这里插入图片描述

2.1.3 文本型

STRING存储变长的文本,对长度没有限制,理论上为2GB。 在这里插入图片描述

2.1.4 布尔及二进制
  • BOOLEAN:表示二元的true或false;
  • BINARY:用于存储变长的二进制数据。
2.1.5 时间类型

TIMESTAMP存储纳秒级别的时间戳,同时Hive提供了一些内置函数用于在TIMESTAMP与Unix时间戳(秒)和字符串之间做转换,如下:

cast(date as date) cast(timestamp as date) cast(string as date) cast(date as string) 
2.2 复杂类型 类型 描述 示例 ARRAY 有序的同类型集合 array(1,2) MAP key-value,key必须为原始类型,value可以为任意类型 map(‘a’,‘1’,‘b’) STRUCT 字段集合,类型可以不同 struct(‘a’,1,1.0),name_stract(‘col1’,‘1’,‘col2’,1.0) UNION 在有限值范围内的一个值 create_union(1,‘a’,63) 2.2.1 STRUCT

文件里的数据分隔符要和建表指定的一致,举例:

① 创建表:

CREATE TABLE IF NOT EXISTS person_1 (id int,info struct<name:string,country:string>) ROW FORMAT DELIMITED FIELDS TERMINATED BY ',' COLLECTION ITEMS TERMINATED BY ':' STORED AS TEXTFILE; 

② 创建一个文本文件test_struct.txt:

1,'dd':'jp' 2,'ee':'cn' 3,'gg':'jp' 4,'ff':'cn' 5,'tt':'jp' 

③ 导入数据:

LOAD DATA LOCAL INPATH '/data/test_struct.txt' OVERWRITE INTO TABLE person_1; 

④ 查询数据:

hive> select * from person_1; OK 1 {"name":"'dd'","country":"'jp'"} 2 {"name":"'ee'","country":"'cn'"} 3 {"name":"'gg'","country":"'jp'"} 4 {"name":"'ff'","country":"'cn'"} 5 {"name":"'tt'","country":"'jp'"} Time taken: 0.046 seconds, Fetched: 5 row(s) hive> select id,info.name,info.country from person_1 where info.name='dd'; OK 1 dd  jp Time taken: 1.166 seconds, Fetched: 1 row(s) 
2.2.2 ARRAY

ARRAY 表示一组相同数据类型的集合,下标从零开始,可以用下标访问:

CREATE TABLE IF NOT EXISTS array_1 (id int,name array<STRING>) ROW FORMAT DELIMITED FIELDS TERMINATED BY ',' COLLECTION ITEMS TERMINATED BY ':' STORED AS TEXTFILE; //导入数据 LOAD DATA LOCAL INPATH '/data/test_array.txt' OVERWRITE INTO TABLE array_1; //查询数据 hive> select * from array_1; OK 1 ["dd","jp"] 2 ["ee","cn"] 3 ["gg","jp"] 4 ["ff","cn"] 5 ["tt","jp"] Time taken: 0.041 seconds, Fetched: 5 row(s) hive> select id,name[0],name[1] from array_1 where name[1]='cn'; OK 2 ee  cn 4 ff  cn Time taken: 1.124 seconds, Fetched: 2 row(s) 
2.2.3 MAP

MAP是一组键值对的组合,可以通过KEY访问VALUE,键值之间同样要在创建表时指定分隔符:

CREATE TABLE IF NOT EXISTS map_1 (id int,name map<STRING,STRING>) ROW FORMAT DELIMITED FIELDS TERMINATED BY ',' COLLECTION ITEMS TERMINATED BY ':' MAP KEYS TERMINATED BY ':' STORED AS TEXTFILE; //加载数据 LOAD DATA LOCAL INPATH '/data/test_map.txt' OVERWRITE INTO TABLE map_1; //查询数据 hive> select * from map_1; OK 1 {"name":"dd","country":"jp"} 2 {"name":"ee","country":"cn"} 3 {"name":"gg","country":"jp"} 4 {"name":"ff","country":"cn"} 5 {"name":"tt","country":"jp"} Time taken: 0.038 seconds, Fetched: 5 row(s) select id,info['name'],info['country'] from map_1 where info['country']='cn'; OK 2 ee  cn 4 ff  cn Time taken: 1.088 seconds, Fetched: 2 row(s) 
2.2.4 UNION

Hive除了支持STRUCT、ARRAY、MAP这些原生集合类型,还支持集合的组合,不支持集合里再组合多个集合。

举例:MAP嵌套ARRAY,手动设置集合格式的数据非常麻烦,建议采用INSERT INTO SELECT形式构造数据再插入UNION表

//创建DUAL表,插入一条记录,用于生成数据 create table dual(d string); insert into dual values('X'); //创建UNION表 CREATE TABLE IF NOT EXISTS uniontype_1 ( id int, info map<STRING,array<STRING>> ) ROW FORMAT DELIMITED FIELDS TERMINATED BY ',' COLLECTION ITEMS TERMINATED BY '-' MAP KEYS TERMINATED BY ':' STORED AS TEXTFILE; //插入数据 insert overwrite table uniontype_1 select 1 as id,map('english',array(99,21,33)) as info from dual union all select 2 as id,map('english',array(44,33,76)) as info from dual union all select 3 as id,map('english',array(76,88,66)) as info from dual; //查询数据 hive> select * from uniontype_1; OK 3 {"german":[76,88,66]} 2 {"chinese":[44,33,76]} 1 {"english":[99,21,33]} Time taken: 0.033 seconds, Fetched: 3 row(s) hive> select * from uniontype_1 where info['english'][2]>30; OK 1 {"english":[99,21,33]} Time taken: 1.08 seconds, Fetched: 1 row(s) 
2.3 类型转换 2.3.1 隐式转换

Hive的类型层次中,可以根据需要进行隐式的类型转换,例如TINYINT与INT相加,则会将TINYINT转化成INT然后INT做加法。隐式转换的规则大致可以归纳如下:

  • 任意数值类型都可以转换成更宽的数据类型(不会导致精度丢失)或者文本类型;
  • 所有的文本类型都可以隐式地转换成另一种文本类型。也可以被转换成 DOUBLE 或者 DECIMAL,转换失败时抛出异常;
  • BOOLEAN 不能做任何的类型转换;
  • 时间戳和日期可以隐式地转换成文本类型。
2.3.1 显式转换

同时,可以使用CAST进行显式的类型转换,例如:

CAST('1' as INT) 

如果转换失败,CAST返回NULL。

03 文末

本文主要讲的是hive的数据类型,结合上一篇博客 《Hive教程(03)- Hive数据模型》,就是存放数据到数据库中共有几种类型,本文完!

关注
打赏
1688896170
查看更多评论

暂无认证

  • 5浏览

    0关注

    107766博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文
立即登录/注册

微信扫码登录

0.1648s