Hive中集合数据类型Struct,Map和Array

Hive中的列支持使用struct,map和array集合数据类型。下表中的数据类型实际上调用的是内置函数。

Hive集合数据类型
数据类型描述字面语法示例
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可能需要由多个不同的表拼装而成,表间需要适当地使用外键来进行连接。

破坏标准格式所带来的一个实际问题是会增大数据冗余的风险,进而导致消耗不必要的磁盘空间,还有可能造成数据不一致,因此当数据发生改变时冗余的拷贝数据可能无法进行相应的同步。

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

建表:

create table jinyong(
name String,
salary float,
subs array<String>,
dedus Map<String,Float>,
KungFu struct<one:String,two:String,three:string,state:int>
) row format delimited
fields terminated by '\001'
collection items terminated by '\002'
map keys terminated by '\003'
lines terminated by '\n'
stored as textfile;
  • 其中,name是一个简单的字符串,salary使用float浮
  • subs (代表小说完整名称)列表是一个字符串值数组。在该数组中,我们可以认为name是“主键”,因此subs中的每一个元素都将会引用这张表中的另一条记录。对于没有完整名称的小说来说,这个宇段对应的值就是一个空的数组。在传统的模型中,将会以另外一种方式来表示这种关系,比如员工和经理这种对应关系。这里我们并非强调我们的模型对于Hive来说是最好的,而只是为了举例展示如何使用数组。
  • 字段dedus是一个由键-值对构成的map,其记录了角色名称和能力值。map中的键是角色的姓名,而且键可以是一个百分比值,也可以完全就是一个数值。在传统数据模型 中,map的键可能存在于不同的表中。这些表在存放特定扣除额值的同时,还有一个外键指向对应的角色记录。
  • 最后,每个角色的武功秘籍使用struct数据类型存储,其中的每个域都被作了命名,并且具有一个特定的类型。

ROW FORMAT DELIMITED这组关键字必须要写在其他子句(除了 STORED AS...子 句)之前。
字符\001 是AA 的八进制数。ROW FORMAT DELIMITED FIELDSTERMINATED BY '\001'这个子句表明Hive将使用^A字符作为列分割符。

同样地,字符\002 是AB 的八进制数。ROW FORMAT DELIMITEDCOLLECTION ITEMS TERMINATED BY '\002'这个子句表明Hive将使用T作为集合元素间的分隔符。

最后,字符、003 是^C的八进制数。ROW FORMAT DELIMITEDMAP KEYS TERMINATED BY ’\003’这个子句表明Hive将使用AC作为map的键和值之间的分隔符。子句 LINES TERMINATED BY '...'和 STORED AS …不需要 ROW FORMAT DELIMITED 关键字。

事实上,Hive到目前为止对于LINESTERMINATEDBY...仅支持字符'\n',也就是 说行与行之间的分隔符只能为‘\n’。因此这个子句现在使用起来还是有限制的。用户可以重新指定列分割符及集合元素间分隔符,而map中键-值间分隔符仍然使用默 认的文本文件格式,因此子句STORED AS TEXTFILE很少被使用到。本书中大多数情 况下,我们使用的都是缺省情况下默认的TEXTFILE文件格式。

虽然用户可以明确指定这些子句,但是在大多数情况下,大多子句还是使用默 认的分割符的,只需要明确指定那些需要替换的分隔符即可。

如下:vi jinyong_kf 文件编辑数据,内容如下:

编辑完成后上传数据到jinyong表

hive (common)> load data local inpath '/otp/datas/jinyong_kf' into table jinyong;

完成后查询数据

hive (common)> select * from jinyong;

这种强大的可定制功能使得可以很容易地使用Hive来处理那些由其他工具和各种各样的ETL(也就是数据抽取、数据装换、数据装载过程)程序产生的文件。

  • 查看数组array使用subs[1],下标是从0开始,如果是一个不存在的元素返回NULL
  • 查看map类型,查询时可以按照 dedus["乔峰"], dedus是map字段名,“乔峰”是其中的参数名,如果是String类型需要加引号
  • 对于Struct 类型的数据可以使用kungfu.one单独查出其中的一个属性值
hive (common)> select name,subs[1],dedus["乔峰"],kungfu.one from jinyong;

 

飞雪连天射白鹿 笑书神侠倚碧鸳

感谢金庸带给我们的武侠世界,您永远活在我们心中!

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值