使用复杂数据类型

请参考Hive DDL_复杂数据类型(视频教程)

复杂数据类型

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的分隔符。


《PySpark原理深入与编程实战》