使用复杂数据类型
复杂数据类型
Hive支持许多复杂的集合数据类型。复杂数据类型以集合形式存储数据,内部实现使用本地序列化和反序列化。
Hive具有如下4种复杂数据类型: Arrays, Maps, Structs, Unions。
- array: 相同类型有序的数据元素集合。
- map: 无序的key-value对集合。
- struct: 类似C语言中的结构体,一个struct是一个对象,包含各种字段(可以是任意数据类型)。
- uniontype: 同一字段不同的行存储不同数据类型的元素。
Hive包含有多个内置的函数来操作数组和map,如explode()函数。下面的示例演示了如何创建Hive表来处理复杂的数据类型。
一、array(等同于数组,可以使用下标来操作相应的元素)
有一群学生,字段"id,name,hobby(多个)",存储在tb_arr.txt文件中:
tb_arr.txt:
1 张三 唱歌,游泳,看书 2 李四 唱歌,看电影,打游戏
现创建Hive表来存储它:
create table tb_arr( id int, name string, hobyy array<string> ) row format delimited fields terminated by '\t' collection items terminated by ',';
加载数据文件到Hive表中:
$ load data local inpath '/home/hduser/data/hive_data/tb_arr.txt' overwrite into table tb_arr;
查看数组中的某一个元素:
select id, name, hobyy[0], hobyy[1] from tb_arr;
二、map(等同于hashmap的操作)
有一群学生,字段有"id,name,scores(chinese,math,english)",存储在tb_map.txt文件中:
1 张三 chinese:90,math:85,english:70 2 李四 chinese:87,math:75,english:95
现创建Hive表来存储它:
create table tb_map ( id int, name string, scores map<string,string> ) row format delimited fields terminated by '\t' collection items terminated by ',' map keys terminated by ':';
使用“,”作为map元素的分割符,对于key和value间的分割符使用“:”。
加载数据文件到Hive表中:
$ load data local inpath '/home/hduser/data/hive_data/tb_map.txt' into table tb_map;
查询map中的特定的值:
select id, name, scores["chinese"] as chinese from tb_map;
三、struct(类似于C语言中的结构体,可以容纳多种类型的数据)
有一群学生,字段有"id,name,info",存储在tb_struct.txt文件中:
1 张三 男,23 2 李四 女,21
现创建Hive表来存储它:
create table tb_struct( id int, name string, info struct<gender: string,age: int> ) row format delimited fields terminated by '\t' collection items terminated by ',' map keys terminated by ':';
加载数据文件到Hive表中:
$ load data local inpath '/home/hduser/data/hive_data/tb_struct.txt' into table tb_struct;
查看其中的struct中某一列数据:
select id, name, info.gender, info.age from tb_struct;
补充:自定义分隔符
1)row format delimited fields terminated by '\t':是确定列分割符。
2)collection items terminated by ',':是确定数组集合元素间的分隔符。
3)map keys terminated by ':':是指map中key-value的分隔符。