返回介绍

Hive 数据类型

发布于 2024-06-23 16:10:22 字数 12764 浏览 0 评论 0 收藏 0

Hive支持原始数据类型和复杂类型,原始类型包括数值型,Boolean,字符串,时间戳。复杂类型包括数组,map,struct。

下面是Hive数据类型汇总:
hive数据类型

基本类型

HQL 的基本类型和 Java 的基本类型很接近,虽然受到一些 MySQL 命名的影响。

整数类型

Hive 有 4 种带符号的整数类型:TINYINT,SMALLINT,INT,BIGINT,分别对应 Java 中的 byte,short,int,long。字节长度分别为 1,2,4,8 字节。在使用整数字面量时,默认情况下为 INT,如果要声明为其他类型,通过后缀来标识:

类型后缀例子
TINYINTY100Y
SMALLINTS100S
BIGINTL100L

小数

浮点类型包括 FLOAT 和 DOUBLE 两种,对应到 Java 的 float 和 double,分别为 32 位和 64 位浮点数。DECIMAL 用于表示任意精度的小树,类似于 Java 的 BigDecimal,通常在货币当中使用。例如 DECIMAL(5,2) 用于存储 -999.99 到 999.99 的数字,省略掉小数位,DECIAML(5) 表示 -99999 到 99999 的数字。DECIMAL 则等同于 DECIMAL(10,0)。小数点左边允许的最大位数为 38 位。

数值类型总结如下表:

类型名称大小范围示例
TINYINT1字节-128 ~ 12745Y
SMALLINT2字节-32768 ~ 32767100S
INT4字节-2147483648 ~ 214748364736
BIGINT8字节-9223372036854770000 ~ 92233720368547700002000L
FLOAT4字节4字节单精度
DOUBLE8字节8字节双精度
DECIMALDECIMAL(9, 7)

文本类型

Hive 有 3 种类型用于存储字文本。STRING 存储变长的文本,对长度没有限制。理论上将STRING 可以存储的大小为 2GB,但是存储特别大的对象时效率可能受到影响,可以考虑使用 Sqoop 提供的大对象支持。VARCHAR 与 STRING 类似,但是长度上只允许在 1-65355 之间。例如 VARCHAR(100)。CHAR 则用固定长度来存储数据。

类型名称描述示例
STRINGstring 类型可以用单引号(’)或双引号(”)定义,Hive 在 string 中使用 C-style。‘hadoop tutorial’
VARCHARvarchar 类型由长度定义,范围为 1-65355 ,如果存入的字符串长度超过了定义的长度,超出部分会被截断。尾部的空格也会作为字符串的一部分,影响字符串的比较。‘hadoop tutorial’
CHARchar 是固定长度的,最大长度 255,而且尾部的空格不影响字符串的比较。‘Hadooptutorial’

布尔及二进制

BOOLEAN:表示二元的 true 或 false。
BINARY:用于存储变长的二进制数据。

时间类型

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

  1. cast(date as date)
  2. cast(timestamp as date)
  3. cast(string as date)
  4. cast(date as string)

时间戳类型的数据不包含任务的时区信息,但是 to_utc_timestampfrom_utc_timestamp 函数可以用于时区转换。DATE 类型则表示日期,对应年月日三个部分。

类型转换

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

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

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

  1. CAST('1' as INT)

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

复杂类型

Hive 有 4 种复杂类型的数据结构:ARRAYMAPSTRUCTUNION

STRUCT

类似于 C、C# 语言,Hive 中定义的 struct 类型也可以使用点来访问。从文件加载数据时,文件里的数据分隔符要和建表指定的一致。

  1. CREATE TABLE IF NOT EXISTS person_1 (id int,info struct<name:string,country:string>)
  2. ROW FORMAT DELIMITED FIELDS TERMINATED BY ','
  3. COLLECTION ITEMS TERMINATED BY ':'
  4. STORED AS TEXTFILE;
  5. //创建一个文本文件test_struct.txt
  6. 1,'dd':'jp'
  7. 2,'ee':'cn'
  8. 3,'gg':'jp'
  9. 4,'ff':'cn'
  10. 5,'tt':'jp'
  11. //导入数据
  12. LOAD DATA LOCAL INPATH '/data/test_struct.txt' OVERWRITE INTO TABLE person_1;
  13. //查询数据
  14. hive> select * from person_1;
  15. OK
  16. 1 {"name":"'dd'","country":"'jp'"}
  17. 2 {"name":"'ee'","country":"'cn'"}
  18. 3 {"name":"'gg'","country":"'jp'"}
  19. 4 {"name":"'ff'","country":"'cn'"}
  20. 5 {"name":"'tt'","country":"'jp'"}
  21. Time taken: 0.046 seconds, Fetched: 5 row(s)
  22. hive> select id,info.name,info.country from person_1 where info.name='dd';
  23. OK
  24. 1 dd jp
  25. Time taken: 1.166 seconds, Fetched: 1 row(s)

ARRAY

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

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

MAP

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

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

UINON

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

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

  1. //创建DUAL表,插入一条记录,用于生成数据
  2. create table dual(d string);
  3. insert into dual values('X');
  4. //创建UNION表
  5. CREATE TABLE IF NOT EXISTS uniontype_1
  6. (
  7. id int,
  8. info map<STRING,array<STRING>>
  9. )
  10. ROW FORMAT DELIMITED FIELDS TERMINATED BY ','
  11. COLLECTION ITEMS TERMINATED BY '-'
  12. MAP KEYS TERMINATED BY ':'
  13. STORED AS TEXTFILE;
  14. //插入数据
  15. insert overwrite table uniontype_1
  16. select 1 as id,map('english',array(99,21,33)) as info from dual
  17. union all
  18. select 2 as id,map('english',array(44,33,76)) as info from dual
  19. union all
  20. select 3 as id,map('english',array(76,88,66)) as info from dual;
  21. //查询数据
  22. hive> select * from uniontype_1;
  23. OK
  24. 3 {"german":[76,88,66]}
  25. 2 {"chinese":[44,33,76]}
  26. 1 {"english":[99,21,33]}
  27. Time taken: 0.033 seconds, Fetched: 3 row(s)
  28. hive> select * from uniontype_1 where info['english'][2]>30;
  29. OK
  30. 1 {"english":[99,21,33]}
  31. Time taken: 1.08 seconds, Fetched: 1 row(s)

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文