玉林市建设工程交易中心网站,网页制作图片教程,自己制作游戏的软件,在服务器网站上做跳转页面跳转这两天有个数据需求#xff0c;记录一下。 原始需求说明产品写得很乱不清晰确认了半天无语死了#xff08;开始骂人#xff09;#xff0c;直接列转换后的问题了 问题1#xff1a; 现有一张办事预约服务记录表reservation_order#xff0c;包含字段用户id、服务名称、服务… 这两天有个数据需求记录一下。 原始需求说明产品写得很乱不清晰确认了半天无语死了开始骂人直接列转换后的问题了 问题1 现有一张办事预约服务记录表reservation_order包含字段用户id、服务名称、服务所属部门、预约状态1已成功 2已取消、预约到场时间时间戳、预约申请创建时间时间戳等简单示例如下。现为了优化预约服务指引产品打算基于用户预约记录找出各办事预约事项相关联的业务线。筛选在2023年1月至2023年3月预约未取消数量大于等于2次的用户列出预约未取消数cnt、按照预约时间顺序列出预约的各部门服务及时间列表item_detail_list, 根据预约未取消数量降序排序筛选前300个用户的预约序列。
iduser_iditem_namedepartment_namereservation_statusreservation_timecreate_time1123Aa116725888000001672586522444
简要分析
各用户预约服务数不同采用collect_list以数组形式存储在一个字段中部门和服务字段采用concat拼接由于服务名称存在标点符号采用其他的标点符号进行拼接便于后续拆分使用要让预约服务按照时间排序即转化为collect_list内部元素排序问题。采用distribute by 和sort by对元素进行分布和排序。对user_id进行分散分布到各个reduce在各 reduce里进行sort by排序。参考具体说明Hivedistribute by与group byorder by与sort by , cluster by的区别
代码如下
select user_id, item_detail, item_list, cnt
from
(select user_id, collect_list(concat(item,:,create_time)) as item_detail, collect_list(item) as item_list, count(1) as cnt
from
(select user_id, concat(department_name,#,item_name) as item,
from_unixtime(cast((reservation_time28800000)/1000 as bigint), yyyy-MM-dd HH:mm:ss) as create_time
from reservation_order
where reservation_time 1672502400000
and reservation_time 1680278400000
and reservation_status ! 2
distribute by user_id
sort by user_id, create_time)a
group by user_id)b
where cnt 2
order by cnt desc
limit 300;遇到新问题及改进 在把这张表推送到mysql数据库的时候发生错误。由于collect_list得到的结果是array类型的mysql没有对应的类型平台试图对item_list字段进行cast as string操作但是报错失败无法直接做cast。
新问题如何把array类型转化为string类型解决方法采用concat_ws对array类型字段按元素拆分再用分隔符连接起来由于item_name的值有包含逗号分号就采用了其他的
代码修改如下
select user_id, concat_ws(|,item_detail) as item_detail, concat_ws(|,item_list) as item_list, cnt
from
(select user_id, collect_list(concat(item,:,create_time)) as item_detail, collect_list(item) as item_list, count(1) as cnt
from
(select user_id, concat(department_name,#,item_name) as item,
from_unixtime(cast((reservation_time28800000)/1000 as bigint), yyyy-MM-dd HH:mm:ss) as create_time
from reservation_order
where reservation_time 1672502400000
and reservation_time 1680278400000
and reserve_status ! 2
distribute by user_id
sort by user_id, create_time)a
group by user_id)b
where cnt 2
order by cnt desc
limit 300;问题2 基于上一阶段得到的item_list,列出重合的业务线及重合次数。根据重合次数进行倒序排序取前30条业务线。
简要分析还没尝试用hsql写只想到用python的方法由短到长排序后就用in或者把业务线先转化为数组然后再去数组元素遍历比较 让俺再想想 先这样