Hive有三种复合数据类型:
数组(array):基于数据(列表)的数据结构形式,array访问通过下标访问对应的值,从0开始
字典(map):基于key-value的数据结构形式,map可以通过["指定key名称"]访问对应的value值
结构体(struct):基于对象的数据结构形式,struct内部的数据可以通过(.)来存取
1、数据类型定义
三种复合结构的定义如下:
数组使用array
字典使用map
结构体使用struct
三种复杂数据类型允许任意层次的嵌套。
下例中用户信息表(dw.dws_user_info_d)使用三种复合结构:
create table if not existsdw.dws_user_info_d
(
uid bigint
,active_days array
,follow_user map
,test_info array>
)
PARTITIONED BY (dt STRING)
ROW FORMAT DELIMITED
FIELDS TERMINATED BY '\t' --字段分隔符
COLLECTION ITEMS TERMINATED BY',' --元素之间分割符
MAP KEYS TERMINATED BY ':' --map K-V对分割符号
LINES TERMINATED BY '\n' --记录之间分隔符
STORED AS TEXTFILE --文件存储格式,parquet、orc等其它格式
;
其中分隔符部分可以使用hive默认的分隔符,如果需要从文件中导入数据,需要指定分隔符才能得到正确的数据内容。
其中:
active_days 使用array类型,值是bigint类型,可存储任意个bigint类型的元素;
follow_user使用map类型,其中key和value都是string类型,可存储任意对string类型的K-V对;
test_info使用array的嵌套方式,其中单个struct必须包含字段中定义的字段个数,字段名称,字段类型;由于可以直接把struct的字段拆分成多个字段来存储,使用struct来存储几个字段的集合比较少,而使用array的嵌套方式是比较常见的使用方式,形成表中表。
2、数据生成
Array数据生成:通过collect_set或collect_list函数将多行的数据聚合成一个array
日活表存储的是每天活跃的用户信息,每个用户活跃的日期和天数是不固定的,可以使用array来存储用户的活跃日期。
日活表(dw.dwf_user_active_d)的定义如下:
create table if not exists dw.dwf_user_active_d
(
uid bigint
,active bigint
);
表中数据如下图所示:
使用collect_set、collect_list函数将每个用户对应的活跃日期聚合成一个array,SQL如下所示:
select uid
,collect_set(active) as active_set
,collect_list(active) as active_list
from dw.dwf_user_active_d
group by uid;
其中2个函数的区别在于collect_set会对元素去重,而collect_list不对元素去重;
Map数据生成:通过concat函数将任意个K-V对拼接成字符串,再通过str_to_map函数将字符串转换成Map类型
用户关注关系表存储用户和粉丝及关注时间