Hive数据结构

                                                                        Hive简介及其数据结构

                                                                        Hive的点点滴滴

  1. Hive是一个基于Hadoop的数据仓库架构,使用SQL语句读,写和管理大型分布式数据集。Hive可以将SQL语句转化为MapReduce(或者Apache Spark和Apache Tez)任务执行,大大降低了Hadoop的使用门槛,减少了开发MapReduce程序的时间成本.
  2. 我们可以将Hive理解为一个客户端工具,其提供了一种类SQL查询语言,称为HiveQL.这使得Hive十分适合数据仓库的统计分析,能够轻松使用HiveQL开启数据仓库任务,如提取/转换/加载(ETL),分析报告和数据分析.Hive不仅可以分析HDFS文件系统中的数据也可以分析其他存储系统,例如HBase.

      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>

)

注意:复杂数据类型允许任意层次的嵌套。复杂数据类型的声明必须使用尖括号,并指定其中数据字段的类型。

 

   

 

 

  

   

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值