今天处理了一点点推荐系统的迁移。
游标性能不咋地,改了之后快了很多。最重要的是可以迁到HIVE里去了,起码饭碗保住了
现在用的推荐系统是在数据仓库里离线计算,生成计算结果推送给网站的。之前用的是基于商品的协同过滤算法,全sql实现,算法本身不是很复杂,但当时为了简单起见,用了游标处理了下。HIVE很不幸地不支持游标,如果要迁过去,要么自己写java程序,要么改写成不用游标的sql实现。显然后一种靠谱点
原来核心算法实现语句
selectm_goods.goods_id goods_id,goods_id prs_goods_id,count(t.user_id) buy_num,t.site_idfrom prs_user_pb twhere t.user_id in(select distinct user_id from prs_user_pb where goods_id=m_goods.goods_id)and goods_id<>m_goods.goods_idgroup by t.goods_id,m_goods.goods_id,t.site_idorder by buy_num desc
m_goods是游标列,每次从游标那取一条数据处理。
prs_user_pb
是先期处理的一张表,为用户和所购买商品的主表
修改后的代码如下
selectt2.goods_id goods_id,t1.goods_id prs_goods_id,count(distinct t1.user_id) buy_num,t1.site_idfrom prs_user_pb t1,(select goods_id,user_id from prs_user_pb) t2where t1.user_id=t2.user_id and t1.goods_id<>t2.goods_idgroup by t1.goods_id,t2.goods_id,t1.site_idorder by buy_num desc