Hive复杂数据类型的嵌套

本文总阅读量

前几天尝试map,struct,map的嵌套,结果失败。之后又查到union还不完善,就以为这个办不成。
今早机缘巧合,看到一篇文章

提到在嵌套多层的情况下,分隔符会随着复合类型嵌套层次的递增而发生变化,分隔符默认会以\001,\002,\003,\004…
变化。
我一看,不行那就试试喽,死马当活马医嘛,结果给“治”好了(¬_¬)。果然药不能停~~~

下面我们分阶段来搞这个嵌套实验,逐层增加难度

map和array嵌套

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
create table testmaparray(
id int,
student_id int,
staff_id int,
value int,
items array<
struct<
value:int,
staff_id:int,
logtime:date
>
>)
row format delimited fields terminated by '\t'
collection items terminated by ' '
map keys terminated by ',';

数据文件

1       3       2       15      15,2,2015-09-03

load到表中后,查询出来:

1       3       2       15      [{"value":15,"staff_id":2,"logtime":"2015-09-03"}]

说明map keys那个分隔符可以分隔struct里面的各个元素

map和struct嵌套

第一次实验

1
2
3
4
5
6
7
8
9
create table testmapstruct(
id int,
comp struct<
info:map<string,string>
>,
favors array<string>)
row format delimited fields terminated by '\t'
collection items terminated by ','
map keys terminated by ':';

数据文件

1       zhuzhi:xianyang,xueli:master,jiguan:shanxi      swimming,running

导入,查询结果:

1       {"info":{"zhuzhi":null,"xianyang":null}}        ["swimming","running"]
  • 本来是用“:”做map里键值的分隔符,结果被解析成struct的分隔符。这里有了歧义。

  • 所以就不能用这种分隔符了。要试试默认的分隔符。

第二次实验

1
2
3
4
5
6
create table testmapstruct2(
id int,
comp struct<
info:map<string,string>
>,
favors array<string>);

分析默认分隔符:

  • 字段之间用\001
  • struct和array里的每个元素之间用\002
  • struct里面的map的每个元素之间用\003
  • map的每个键值对里面的键和值之间用\004

数据文件

1^Azhuzhi^Dxianyang^Cxueli^Dmaster^Cjiguan^Dshanxi^Aswimming^Brunning

导入,查询结果:

1       {"info":{"zhuzhi":"xianyang","xueli":"master","jiguan":"shanxi"}}       ["swimming","running"]

map、struct和map嵌套

后面再来写哈(✿◡‿◡)