Hive系列文章
Hadoop完全分布式搭建(腾讯云服务器+阿里云服务器) hive系列之一:Hive搭建 hive系列之二:Hive基础知识 Hive系列之三:开窗函数详解 Hive系列之四:自定义函数UDF UDTF UDAF
概述
Hive 的内置数据类型可以分为两大类:
-
基础数据类型; -
复杂数据类型;
基础数据类型
其中,基础数据类型包括:TINYINT,SMALLINT,INT,BIGINT,BOOLEAN,FLOAT,DOUBLE,STRING,BINARY,TIMESTAMP,DECIMAL,CHAR,VARCHAR,DATE。
Numeric Types
数据类型 | 介绍 | 备注 |
---|
TINYINT | 1 字节有符号整数,从-128 到127 | | SMALLINT | 2 字节有符号整数,从-32,768 到32,767 | | INT/INTEGER | 24字节有符号整数,从-2,147,483,648 到 2,147,483,647 | | BIGINT | 8 字节有符号整数,从-9,223,372,036,854,775,808 到9,223,372,036,854,775,807 | | BOOLEAN | | | FLOAT | 4 字节单精度浮点数 | | DOUBLE | 8 字节双精度浮点数 | | DOUBLEPRECISION | alias for DOUBLE | 从Hive2.2.0开始支持 | DECIMAL | 精度为 38 位 | 在 Hive 0.11.0中引入,精度为 38 位, Hive 0.13.0引入了用户可定义的精度和比例 | NUMERIC | 等同于DECIMAL | 与DECIMAL 相同,从Hive 3.0.0开始支持 |
Date/Time Types
数据类型 | 介绍 | 备注 |
---|
TIMESTAMP | 时间戳 | 从 Hive 0.8.0开始可用 | DATE | 日期 | 从 Hive 0.12.0开始可用 | INTERVAL | 用作时间加减 | 从 Hive 1.2.0开始可用 |
String Types
数据类型 | 介绍 | 备注 |
---|
STRING | 存储变长文本,长度无限制 | | VARCHAR | 有长度限制,不定长,在1-65355之间 | 从 Hive 0.12.0开始可用 | CHAR | 长度比varchar短很多,定长1-255 | 从 Hive 0.13.0开始可用 |
Misc Types
数据类型 | 介绍 | 备注 |
---|
BOOLEAN | 布尔值 | | BINARY | 二进制类型 | 从 Hive 0.8.0开始可用 |
复杂数据类型
数据类型 | 介绍 | 备注 |
---|
ARRAY | 数组:ARRAY<data_type> | 从 Hive 0.14开始可用 | MAP | MAP<primitive_type, data_type> | 从 Hive 0.14开始可用 | STRUCT | STRUCT<col_name : data_type [COMMENT col_comment], …> | | UNION | UNIONTYPE<data_type, data_type, …> | 从 Hive 0.7.0开始可用 |
Array Types
Array的结构
创建数据文件arryTest.txt
[hadoop@master data]$ vim arryTest.txt
添加以下内容, 注意行末的tab
1,2,3,4 you,are,a,boy
5,6,7,8 she,is,a,girl
建表myhive.arraytest
[hadoop@master sql_script]$ vim arrayTest.sql
脚本如下:
create table myhive.array_test(
id array<int>,
info array<string>
)
row format delimited
fields terminated by '\t'
collection items terminated by ',';
~
插入数据
0: jdbc:hive2:
Loading data to table myhive.array_test
OK
No rows affected (8.416 seconds)
查看数据
0: jdbc:hive2:
OK
+
| array_test.id | array_test.info |
+
| [1,2,3,4] | ["you","are","a","boy"] |
| [5,6,7,8] | ["she","is","a","girl"] |
+
2 rows selected (3.943 seconds)
Array操作
0: jdbc:hive2:
OK
+
| _c0 | _c1 |
+
| 4 | 4 |
| 4 | 4 |
+
2 rows selected (3.454 seconds)
0: jdbc:hive2:
OK
+
| _c0 | _c1 |
+
| 3 | NULL |
| 7 | NULL |
+
2 rows selected (3.296 seconds)
0: jdbc:hive2:
OK
+
| _c0 | _c1 |
+
| 3 | boy |
| 7 | girl |
+
2 rows selected (3.281 seconds)
0: jdbc:hive2:
是否包含某个值
0: jdbc:hive2:
OK
+
| array_test.id | array_test.info |
+
| [1,2,3,4] | ["you","are","a","boy"] |
+
1 row selected (3.123 seconds)
0: jdbc:hive2:
拆成单条多行记录
0: jdbc:hive2:
. . . . . . . . . . . . . . > from myhive.array_test
. . . . . . . . . . . . . . > lateral view explode(info) tb as col1;
OK
+
| col1 |
+
| you |
| are |
| a |
| boy |
| she |
| is |
| a |
| girl |
+
8 rows selected (0.766 seconds)
0: jdbc:hive2:
Map Types
map的结构
创建map表
0: jdbc:hive2:
. . . . . . . . . . . . . . > id int comment "主键id"
. . . . . . . . . . . . . . > ,int_map map<string,int> comment "int型map"
. . . . . . . . . . . . . . > ,str_map map<string,string> comment "string型map"
. . . . . . . . . . . . . . >
. . . . . . . . . . . . . . > );
OK
No rows affected (7.89 seconds)
0: jdbc:hive2:
插入数据:map的存储形式:key-value,如:{“张三”,23,“性别“,“male”}
0: jdbc:hive2:
. . . . . . . . . . . . . . > select 12,map('年龄',18,'性别',1),map('姓名','张三');
注意 insert into 速度比较慢,最好用load
查看数据
0: jdbc:hive2:
OK
+
| map_test.id | map_test.int_map | map_test.str_map |
+
| 12 | {"年龄":18,"性别":1} | {"姓名":"张三"} |
+
map操作函数
key键查询
0: jdbc:hive2:
OK
+
| imap_keys | smap_keys |
+
| ["年龄","性别"] | ["姓名"] |
+
1 row selected (3.004 seconds
value值查询
0: jdbc:hive2:
OK
+
| int_values | str_values |
+
| [18,1] | ["张三"] |
+
1 row selected (2.994 seconds)
0: jdbc:hive2:
键值对查询
0: jdbc:hive2:
OK
+
| pair_cnt |
+
| 2 |
+
1 row selected (2.989 seconds)
0: jdbc:hive2:
map数据加工
0: jdbc:hive2:
. . . . . . . . . . . . . . > from myhive.map_test
. . . . . . . . . . . . . . > lateral view explode(str_map) tb as str_key,str_value;
OK
+
| id | str_key | str_value |
+
| 12 | 姓名 | 张三 |
+
1 row selected (0.839 seconds)
0: jdbc:hive2:
0: jdbc:hive2:
. . . . . . . . . . . . . . > from myhive.map_test
. . . . . . . . . . . . . . > lateral view explode(int_map) tb as int_key,int_value;
OK
+
| id | int_key | int_value |
+
| 12 | 年龄 | 18 |
| 12 | 性别 | 1 |
+
2 rows selected (0.832 seconds)
0: jdbc:hive2:
Struct Types
struct的结构
struct('a',1,2,3,4) 这个数据类型的特点就是可以包含各种各样的数据类型,struct 可以是任意数据类型,但在写struct数据类型时,在<> 中要写清楚struct字段中的字段名称跟数据类型。
创建struct表:strucTset.sql
内容如下:
create table myhive.struct_test(
ip string,
userinfo struct<name:string,age:int>
)
ROW FORMAT DELIMITED FIELDS TERMINATED BY '#'
COLLECTION ITEMS TERMINATED BY ':';
执行:
[hadoop@master sql_script]$ hive -f strucTest.sql
新建数据文件:strucTest.txt
内容如下:
[hadoop@master data]$ vim strucTest.txt
192.168.1.1
192.168.1.2
192.168.1.3
插入数据:load
0: jdbc:hive2:
Loading data to table myhive.struct_test
OK
No rows affected (8.728 seconds)
0: jdbc:hive2:
OK
+
| tab_name |
+
| array_test |
| bucket |
| bucket_com |
| employee |
| map_test |
| mix_partition |
| salary_dynamic_partition |
| static_mix |
| struct_test |
| stu |
| stu_scores |
| table_column_type |
+
12 rows selected (2.144 seconds)
0: jdbc:hive2:
OK
+
| struct_test.ip | struct_test.userinfo |
+
| 192.168.1.1 | {"name":"lisi","age":20} |
| 192.168.1.2 | {"name":"zhaosi","age":21} |
| 192.168.1.3 | {"name":"liming","age":22} |
+
3 rows selected (3.59 seconds)
0: jdbc:hive2:
struct操作
查询struct中的元素
0: jdbc:hive2:
OK
+
| s.ip | name | age |
+
| 192.168.1.1 | lisi | 20 |
| 192.168.1.2 | zhaosi | 21 |
| 192.168.1.3 | liming | 22 |
+
3 rows selected (3.635 seconds)
0: jdbc:hive2:
Union Types
union 语法
用来合并多个select的查询结果,需要保证select中字段须一致,每个select语句返回的列的数量和名字必须一样,否则,一个语法错误会被抛出。
select_statement UNION [ALL | DISTINCT] select_statement UNION [ALL | DISTINCT] select_statement …
注意
- 使用DISTINCT关键字与使用UNION 默认值效果一样,都会删除重复行。
- 使用ALL关键字,不会删除重复行,结果集包括所有SELECT语句的匹配行(包括重复行)。
- 可以显式使用UNION DISTINCT,也可以通过使用UNION而不使用DISTINCT或ALL关键字来隐式生成。
- Hive 1.2.0之前的版本仅支持UNION ALL,其中重复的行不会被删除。
- Hive 1.2.0和更高版本中,UNION的默认行为是从结果中删除重复的行。
union 使用示例
0: jdbc:hive2:
OK
+
| stu.id | stu.name |
+
| 10001 | Eric |
+
1 row selected (3.384 seconds)
0: jdbc:hive2:
OK
+
| employee.id | employee.name |
+
| 10000 | Stff |
| 10001 | Joe |
| 10002 | Ruby |
| 10003 | Betty |
+
4 rows selected (3.4 seconds)
0: jdbc:hive2:
. . . . . . . . . . . . . . > from myhive.stu
. . . . . . . . . . . . . . > union
. . . . . . . . . . . . . . > select cast(id as string),name
. . . . . . . . . . . . . . > from myhive.employee;
Query ID = hadoop_20210824143837_e6c6a762-80ac-43ae-8687-f21ed096de08
OK
+
| _u1.id | _u1.name |
+
| 10000 | Stff |
| 10001 | Eric |
| 10001 | Joe |
| 10002 | Ruby |
| 10003 | Betty |
+
5 rows selected (514.652 seconds)
0: jdbc:hive2:
|