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

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

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

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

数据类型描述字面语法示例
STRUCT和C语言中的struct或者“对象”类似,都可以通过“点”符号访问元素内容。例如,如果某个列的数据类型是STRUCT{first STRING, last STRING},那么第1个元素可以通过字段名.first来引用struct('John','Doe')
MAPMAP是一组键值对元组集合,使用数组表示法(例如[‘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<STRING>,
 deductions    MAP<STRING, FLOAT>,
 address      STRUCT<street:STRING, city:STRING, state:STRING, zip:INT>);

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

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

  • 5
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

von Neumann

您的赞赏是我创作最大的动力~

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值