数据仓库Hive编程——数据类型和文件格式(二):集合数据类型

分类目录:商业智能《数据仓库Hive编程》总目录

相关文章:
数据类型和文件格式(一):基本数据类型
数据类型和文件格式(二):集合数据类型
数据类型和文件格式(三):文本文件数据编码
数据类型和文件格式(四):读时模式

Hive中的列支持使用structmaparray集合数据类型。需要注意的是下表中语法示例实际上调用的是内置函数。

数据类型 描述 字面语法示例
STRUCT 和C语言中的struct或者“对象”类似,都可以通过“点”符号访问元素内容。例如,如果某个列的数据类型是STRUCT{first STRING, last STRING},那么第1个元素可以通过字段名.first来引用 struct('John','Doe')
MAP MAP是一组键值对元组集合,使用数组表示法(例如[‘key’])可以访问元素。例如,如果某个列的数据类型是MAP,其中键值对是‘first’->‘John’‘last’->‘Doe’,那么可以通过字段名[‘last’]获取最后1个元素 map('first','JOIN','last',Doe')
ARRAY 数组是一组具有相同类型和名称的变量的集合。这些变量称为数组的元素,每个数组元素都有一个编号,编号从零开始。例如,数组值为[‘John’,‘Doe’],那么第2个元素可以通过数组名[1]进行引用 Array('John','Doe')

和基本数据类型一样,这些类型的名称同样是保留字。大多数的关系型数据库并不支持这些集合数据类型,因为使用它们会趋向于破坏标准格式。例如,在传统数据模型中,structs可能需要由多个不同的表拼装而成,表间需要适当地使用外键来进行连接。破坏标准格式所带来的一个实际问题是会增大数据冗余的风险,进而导致消耗不必要的磁盘空间,还有可能造成数据不一致,因为当数据发生改变时冗余的拷贝数据可能无法进行相应的同步。

然而,在大数据系统中,不遵循标准格式的一个好处就是可以提供更高吞吐量的数据。当处理的数据的数量级是T或者P时,以最少的“头部寻址”来从磁盘上扫描数据是非常必要的。按数据集进行封装的话可以通过减少寻址次数来提供查询的速度。而如果根据外键关系关联的话则需要进行磁盘间的寻址操作,这样会有非常高的性能消耗。

这里有一个用于演示如何使用这些数据类型的表结构声明语句,这是一张虚构的人力资源应用程序中的员工表:

CREATE TABLE employees (
 name       STRING,
 salary      FLOAT,
 subordinates   ARRAY,
 deductions    MAP,
 address      STRUCT);

其中,name是一个简单的字符串;对于大多数雇员来说,salary使用float浮点数类型来表示就已经足够了;subordinates列表是一个字符串值数组。在该数组中,我们可以认为name是“主键”,因此subordinates中的每一个元素都将会引用这张表中的另一条记录。对于没有下属的雇员,这个字段对应的值就是一个空的数组。在传统的模型中,将会以另外一种方式来表示这种关系,也就是雇员和雇员的经理这种对应关系。这里我们并非强调我们的模型对于Hive来说是最好的,而只是为了举例展示如何使用数组。字段deductions是一个由键值对构成的map,其记录了每一次的扣除额,这些钱将会在发薪水的时候从员工工资中扣除掉。map中的键是扣除金额项目的名称,而且键可以是一个百分比值,也可以完全就是一个数值。在传统数据模型中,这个扣除额项目的名称)可能存在于不同的表中。这些表在存放特定扣除额值的同时,还有一个外键指向对应的雇员记录。最后,每名雇员的家庭住址使用struct数据类型存储,其中的每个域都被作了命名,并且具有一个特定的类型。

请注意后面是如何使用Java语法惯例来表示集合数据类型的。例如,MAP表示map中的每个键都是STRING数据类型的,而每个值都是FLOAT数据类型的。对于ARRAY,其中的每个条目都是STRING类型的。STRUCT可以混合多种不同的数据类型,但是STRUCT中一旦声明好结构,那么其位置就不可以再改变。

你可能感兴趣的:(数据仓库Hive编程)