IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 大数据 -> Hive系列之五:hive数据类型 -> 正文阅读

[大数据]Hive系列之五:hive数据类型

Hive系列文章

Hadoop完全分布式搭建(腾讯云服务器+阿里云服务器)
hive系列之一:Hive搭建
hive系列之二:Hive基础知识
Hive系列之三:开窗函数详解
Hive系列之四:自定义函数UDF UDTF UDAF

概述

Hive 的内置数据类型可以分为两大类:

  1. 基础数据类型;

  2. 复杂数据类型;

基础数据类型

其中,基础数据类型包括:TINYINT,SMALLINT,INT,BIGINT,BOOLEAN,FLOAT,DOUBLE,STRING,BINARY,TIMESTAMP,DECIMAL,CHAR,VARCHAR,DATE。

Numeric Types

数据类型介绍备注
TINYINT1 字节有符号整数,从-128127
SMALLINT2 字节有符号整数,从-32,76832,767
INT/INTEGER24字节有符号整数,从-2,147,483,6482,147,483,647
BIGINT8 字节有符号整数,从-9,223,372,036,854,775,8089,223,372,036,854,775,807
BOOLEAN
FLOAT4 字节单精度浮点数
DOUBLE8 字节双精度浮点数
DOUBLEPRECISIONalias for DOUBLE从Hive2.2.0开始支持
DECIMAL精度为 38 位在 Hive 0.11.0中引入,精度为 38 位, Hive 0.13.0引入了用户可定义的精度和比例
NUMERIC等同于DECIMALDECIMAL相同,从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开始可用
MAPMAP<primitive_type, data_type>从 Hive 0.14开始可用
STRUCTSTRUCT<col_name : data_type [COMMENT col_comment], …>
UNIONUNIONTYPE<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://master:10000> LOAD DATA LOCAL INPATH '/opt/export/data/arryTest.txt' OVERWRITE INTO TABLE myhive.array_test;
Loading data to table myhive.array_test
OK
No rows affected (8.416 seconds) 

查看数据

0: jdbc:hive2://master:10000> select * from myhive.array_test;
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操作

# size() 计算长度
0: jdbc:hive2://master:10000> select size(id),size(info) from myhive.array_test;
OK
+------+------+
| _c0  | _c1  |
+------+------+
| 4    | 4    |
| 4    | 4    |
+------+------+
2 rows selected (3.454 seconds)

# 注意下表是从0开始
0: jdbc:hive2://master:10000> select id[2],info[4] from myhive.array_test;
OK
+------+-------+
| _c0  |  _c1  |
+------+-------+
| 3    | NULL  |
| 7    | NULL  |
+------+-------+
2 rows selected (3.296 seconds)

0: jdbc:hive2://master:10000> select id[2],info[3] from myhive.array_test;
OK
+------+-------+
| _c0  |  _c1  |
+------+-------+
| 3    | boy   |
| 7    | girl  |
+------+-------+
2 rows selected (3.281 seconds)
0: jdbc:hive2://master:10000> 

是否包含某个值

# 是否包含某个值
# (array_contains()),Boolean型(true/false,where条件)
0: jdbc:hive2://master:10000> select * from myhive.array_test where array_contains(info,'boy');
OK
+----------------+--------------------------+
| array_test.id  |     array_test.info      |
+----------------+--------------------------+
| [1,2,3,4]      | ["you","are","a","boy"]  |
+----------------+--------------------------+
1 row selected (3.123 seconds)
0: jdbc:hive2://master:10000> 

拆成单条多行记录

0: jdbc:hive2://master:10000> select col1
. . . . . . . . . . . . . . > 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://master:10000>

Map Types

map的结构

创建map表

0: jdbc:hive2://master:10000> create table myhive.map_test(
. . . . . . . . . . . . . . >    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://master:10000>

插入数据:map的存储形式:key-value,如:{“张三”,23,“性别“,“male”}

0: jdbc:hive2://master:10000> insert into myhive.map_test(id,int_map,str_map) 
. . . . . . . . . . . . . . > select 12,map('年龄',18,'性别',1),map('姓名','张三');

注意 insert into 速度比较慢,最好用load

查看数据

0: jdbc:hive2://master:10000> select * from map_test;
OK
+--------------+-------------------+-------------------+
| map_test.id  | map_test.int_map  | map_test.str_map  |
+--------------+-------------------+-------------------+
| 12           | {"年龄":18,"性别":1}  | {"姓名":"张三"}  |
+--------------+-------------------+-------------------+

map操作函数

key键查询

# map_keys(colName) 
# 结果是一个Array,如果希望提取,则使用[index],如map_keys(smap)[0]
0: jdbc:hive2://master:10000> select map_keys(int_map) as imap_keys,map_keys(str_map) as smap_keys from myhive.map_test;
OK
+--------------+------------+
|  imap_keys   | smap_keys  |
+--------------+------------+
| ["年龄","性别"]  | ["姓名"] |
+--------------+------------+
1 row selected (3.004 seconds

value值查询

# map_values(colname)
0: jdbc:hive2://master:10000> select map_values(int_map) as int_values,map_values(str_map) as str_values from myhive.map_test;
OK
  +-------------+-------------+
| int_values  | str_values  |
+-------------+-------------+
| [18,1]      | ["张三"]      |
+-------------+-------------+
1 row selected (2.994 seconds)
0: jdbc:hive2://master:10000> 

键值对查询

#  size(colName),返回对应列有多少个key-value
0: jdbc:hive2://master:10000> select size(int_map) as pair_cnt from myhive.map_test;
OK
+-----------+
| pair_cnt  |
+-----------+
| 2         |
+-----------+
1 row selected (2.989 seconds)
0: jdbc:hive2://master:10000>

map数据加工

# 将map列拆分为key、value列
# str_map中只存在单个key-value的情况,所有lateral之后,数据有单列变成双列。但是行数没有变化
0: jdbc:hive2://master:10000> select id,str_key,str_value
. . . . . . . . . . . . . . > 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://master:10000>

# int_map中 存在多个键值对。操作之后,行数会增加
0: jdbc:hive2://master:10000> select id,int_key,int_value
. . . . . . . . . . . . . . > 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://master:10000> 

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>	--struct这个数据类型中的字段名,字段类型
)
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#lisi:20
192.168.1.2#zhaosi:21
192.168.1.3#liming:2

插入数据:load

0: jdbc:hive2://master:10000> load data local inpath '/opt/export/data/strucTest.txt' overwrite into table myhive.struct_test;
Loading data to table myhive.struct_test
OK
No rows affected (8.728 seconds)
0: jdbc:hive2://master:10000> show tables;
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://master:10000> select * from struct_test;
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://master:10000> 

struct操作

查询struct中的元素

0: jdbc:hive2://master:10000> select s.ip, s.userinfo.name, s.userinfo.age from myhive.struct_test s;
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://master:10000>

Union Types

union 语法

用来合并多个select的查询结果,需要保证select中字段须一致,每个select语句返回的列的数量和名字必须一样,否则,一个语法错误会被抛出。

select_statement UNION [ALL | DISTINCT] select_statement UNION [ALL | DISTINCT] select_statement …

注意

  1. 使用DISTINCT关键字与使用UNION 默认值效果一样,都会删除重复行。
  2. 使用ALL关键字,不会删除重复行,结果集包括所有SELECT语句的匹配行(包括重复行)。
  3. 可以显式使用UNION DISTINCT,也可以通过使用UNION而不使用DISTINCT或ALL关键字来隐式生成。
  4. Hive 1.2.0之前的版本仅支持UNION ALL,其中重复的行不会被删除。
  5. Hive 1.2.0和更高版本中,UNION的默认行为是从结果中删除重复的行。

union 使用示例

0: jdbc:hive2://master:10000> select * from myhive.stu;
OK
+---------+-----------+
| stu.id  | stu.name  |
+---------+-----------+
| 10001   | Eric      |
+---------+-----------+
1 row selected (3.384 seconds)
0: jdbc:hive2://master:10000> select * from myhive.employee;
OK
+--------------+----------------+
| employee.id  | employee.name  |
+--------------+----------------+
| 10000        | Stff           |
| 10001        | Joe            |
| 10002        | Ruby           |
| 10003        | Betty          |
+--------------+----------------+
4 rows selected (3.4 seconds)

0: jdbc:hive2://master:10000> select id,name
. . . . . . . . . . . . . . > 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://master:10000> 

  大数据 最新文章
实现Kafka至少消费一次
亚马逊云科技:还在苦于ETL?Zero ETL的时代
初探MapReduce
【SpringBoot框架篇】32.基于注解+redis实现
Elasticsearch:如何减少 Elasticsearch 集
Go redis操作
Redis面试题
专题五 Redis高并发场景
基于GBase8s和Calcite的多数据源查询
Redis——底层数据结构原理
上一篇文章           查看所有文章
加:2021-08-25 23:44:49  更:2021-08-25 23:44:53 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/23 13:34:45-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码