hive 字符串拼接_Hive三种复合数据类型

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

);

表中数据如下图所示:

6cbe88be7aff8111b68f4d1dd5c542a4.png

使用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;

3c3ea18afd9daa9bb9096b2008a1ff06.png

其中2个函数的区别在于collect_set会对元素去重,而collect_list不对元素去重;

  • Map数据生成:通过concat函数将任意个K-V对拼接成字符串,再通过str_to_map函数将字符串转换成Map类型

用户关注关系表存储用户和粉丝及关注时间信息&

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值