赞
踩
Hive简介及其数据结构
Hive的点点滴滴
3.1数据单元
Hive中核心的几个数据单元解析如下。
3.1.1元数据
元数据(MetaData)是指数据的各项属性信息,例如数据的类型,结构,数据库,表,视图的信息等.
3.1.2 数据库
Hive中的数据库相当于一个命名空间,用于避免表,分区,列之间出现命名冲突,以确保用户和用户组的安全。
3.1.3 表
数据库中的表由若干行组成,每行数据都有相同的模式和相同属性的列.Hive中的表可以分为内部表和外部表。
3.1.3.1 内部表: 通常所说的表就是指内部表,也叫管理表。内部表数据被存储在数据仓库的目录中,当删除内部表时,表数据及其元数据将一同被删除.
3.1.3.2 外部表: 外部表在创建时,数据可以存储于指定的HDFS目录中,也可以存储于数据仓库中,还可以与指定的HDFS目录中的数据相关联。外部表被删除时,只有元数据被删除,实际数据不会被删除。
4. 分区
Hive在查询数据的时候会扫描整个表的数据,如果表非常大,则会耗费大量时间和资源。因此,Hive引入了表分区的功能,每个表可以有一个或多个分区,这些分区决定了数据的存储方式,使查询操作只扫描相关性高的那部分数据,从而大大提高了Hive的工作效率。
4.1 桶
每个分区根据表的某列数据的哈希值被划分为若干个桶,每个桶对应分区下的一个数据文件。
对表进行分区和分桶不是必须的,但这样可以减少对不必要数据的访问,从而提高查询速度。
5 数据类型
Hive的数据类型分为基本数据类型和复杂数据类型。基本数据类型与常用的大部分数据库类似,包括以下几种:
整型: TINYINT,SMALLINT,INT,BIGINT.
布尔型: TRUE/FALSE.
浮点型: FLOAT(单精度),DOUBLE(双精度).
定点型: DECIMAL
字符型:STRING,VARCHAR,CHAR.
日期和时间型: TIMESTAMP,DATE.
二进制型: BINARY,用于存储变长的二进制数据.
Hive复杂数据类型主要有以下三种.
6.1结构体(STRUCT)
STRUCT是一个记录类型,封装了一个命名字段集合。一个STRUCT类型的元素可以包含不同类型的其他元素,并且可以使用点符号”.”访问类型中的元素。例如,表中的c列的数据类型为STRUCT<a STRING,b INT>,则可以通过c.a访问c列中的元素a。
例如现在需要创建一张学生表”student”,其中有两列,一列是主键id,另一列是学生信息info,其中学生信息包括姓名和年龄,则该表的创建语句如下:
CREATE TABLE student(id INT,info STRUCT<name:STRING,age:INT>)
向表”student”中导入以下测试数据:
1,zhangsan:24
2,lisi:25
3,wangwu:19
若需要查询年龄大于20的所有数据,查询语句如下:
SELECT * FROM student WHERE info.age>20;
查询输出结果为:
1 {“name”:”zhangsan”,”age”:24}
2 {“name”:”lisi”,”age”:25}
6.2键值对(MAP)
类似于Java中的Map,使用键值对存储数据,根据键可以访问值。例如,表中c列用于存储学生的姓名和年龄,数据类型为MAP<STRING,INT>(姓名为键,年龄为值),访问c列中的键zhangsan对应的年龄,可以写为c[‘zhangsan’]。
在上方的学生表例子中,若将列info的类型改为MAP<STRING,INT>,则创建表的语句如下:
CREATE TABLE student(id INT, info MAP<STRING,INT>)
然后向表中导入以下测试数据:
1 zhangsan:20,english:98
2 lisi:24,english:92
3 wangwu:25,english:87
查询姓名为zhangsan,年龄为20的所有数据,查询语句如下:
SELECT * FROM student WHERE info[zhangsan]=20;
查询输出结果为:
1 zhangsan:20,english:98
6.3 数组(ARRAY)
类似于Java中的数组,数组中所有元素的类型相同。例如,表中c列的数据类型为ARRAY<INT>,访问该列的第一个元素可以写为c[0]。
仍然以上方的学生表为例,若将列info的类型改为ARRAY<STRING>,则创建表的语句如下:
CREATE TABLE student(id INT,info ARRAY<STRING>)
然后向表中导入以下测试数据(冒号前面为数组的第一个值,后面为第二个值):
1,zhangsan:24
2,lisi:25
3,wangwu:19
查询表中年龄大于20的所有数据,查询语句如下:
SELECT * FROM student WHERE info[1] >20;
查询输出结果为:
1 [“zhangsan”,”24”]
2 [“lisi”,”25”]
此外,一张表中也可以存在多个复杂数据类型。例如,创建表”student”,其中有三列col1,col2和col3,每一列都使用复杂数据类型,创建语句如下:
CREATE TABLE student(
col1 STRUCT<a:STRING,b:INT,c:DOUBLE>,
col2 MAP<STRING,INT>,
col3 ARRAY<INT>
)
注意:复杂数据类型允许任意层次的嵌套。复杂数据类型的声明必须使用尖括号,并指定其中数据字段的类型。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。