返回顶部
首页 > 资讯 > 前端开发 > VUE >SQL如何快速实现UCF
  • 385
分享到

SQL如何快速实现UCF

2024-04-02 19:04:59 385人浏览 安东尼
摘要

这篇文章主要介绍了sql如何快速实现UCF,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。SQLselect uid1,u

这篇文章主要介绍了sql如何快速实现UCF,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。

SQL

select uid1,uid2,sim from (     select uid1         ,uid2         ,cnt12 / sqrt(cnt1*cnt2) sim         ,row_number() over(partition by uid1 order by cnt12 / sqrt(cnt1*cnt2) desc) sim_rn     from (         select a.uid uid1             ,b.uid uid2             ,count(a.iid) cnt12          from tb_behavior a         join tb_behavior b         on a.iid = b.iid         where a.uid <> b.uid         group by a.uid,b.uid     ) a12     join (select uid,count(iid) cnt1 from tb_behavior group by uid) a1     on a12.uid1 = a1.uid     join (select uid,count(iid) cnt2 from tb_behavior group by uid) a2     on a12.uid1 = a2.uid ) tb_neighbour where sim > 0.1 and sim_rn <= 30

读者实现的话只需要把上面的tb_behavior表替换成自己业务的用户行为即可;iid,uid分别对应物品id和用户id;

根据共现相似度,即共同喜好的物品个数比上各自喜好物品总数乘积取平方;最后截断用户最相似的前30个邻居作为推荐的依据。

上面构造了邻居表,下面就是根据邻居的喜好为用户推荐了,具体sql如下:

select uid1,iid from (     select uid1         ,iid         ,max(sim) score         ,row_number() over(partition by uid1 order by max(sim) desc) user_rn     from tb_neighbour a12     join (select uid,iid from tb_behavior) a2     on a12.uid2 = a2.uid     join (select uid,collect_set(iid) iids1 from tb_behavior group by uid) a1     on a12.uid1 = a1.uid     where not array_contaions(iids1,a2.iid)     group by uid1,iid ) tb_rec where user_rn <= 500

这里说明下包括上面的top30邻居和用户top500的最大推荐列表都是工程优化,截断节约些存储;具体读者可以根据自己业务需要进行设置;

然后大概说下各个表的含义:a1表是用户已消费过的物品,a2表是用户每个邻居喜好的物品;那么也就是说从邻居喜好的物品中过滤掉已经消费的

物品整体根据共现相似度进行排序

思考

但思路很简单、实际作者开发中总会遇到各种各样的问题,下面就捡几个主要的和大家一起讨论下:

  • 1.join引起的数据倾斜问题:tb_neighbour表很大,往往热点物品会占据80%的曝光和消费记录,如何解决?

  • 2.增量更新问题:上面的框架,tb_behavior表每次都是全量计算,是否能改造成增量更新邻居表和推荐结果,并减少计算时间呢?

join引起的数据倾斜问题

先思考问题1,既然我们目的是求相似邻居,物品join只是为了关联上一组用户对,那自然的想法是可以根据feed做近似采样、相似度精度也几乎无损失。

下面我试着实现下这种思路:

with tb_behavior_sample as (     select uid,iid      from (         select uid             ,iid             ,row_number() over(partition by iid order by rand()) feed_rn         from tb_behavior     ) bh     where feed_rn <= 50000 )   select uid1,uid2,sim from (     select uid1         ,uid2         ,cnt12 / sqrt(cnt1*cnt2) sim         ,row_number() over(partition by uid1 order by cnt12 / sqrt(cnt1*cnt2) desc) sim_rn     from (         select a.uid uid1             ,b.uid uid2             ,count(a.iid) cnt12          from tb_behavior_sample a         join tb_behavior_sample b         on a.iid = b.iid         where a.uid <> b.uid         group by a.uid,b.uid     ) a12     join (select uid,count(iid) cnt1 from tb_behavior group by uid) a1     on a12.uid1 = a1.uid     join (select uid,count(iid) cnt2 from tb_behavior group by uid) a2     on a12.uid1 = a2.uid ) tb_neighbour where sim > 0.1 and sim_rn <= 30

这里用了Hive的with as语法,读者可自行查阅,篇幅有限,就不展开了;feed_rn就是随机采样了50000条,实际操作时读者可以先统计下item的分布、大概找到一个阈值;

比如取top10的item的出现次数作为阈值;那计算相似度时分子最多减小10,分母不变。这对大多数情况精度应该足够了,而且因为避免了数据倾斜,大大降低了计算时间。

增量更新问题

问题2是一个工程问题,lambda架构能使初始结果效果不错,可直接上线灰度了;在此基础上再加小时或者天增量;kappa架构相对就比较繁琐、需要一开始就设计增量流程。

精度方面也需要一定的累积;不过如何选择,读者可以根据自己的数据量和熟悉程度自行选择;作者这里仅以kappa架构说明。

重新review上面sql,我们发现我们仅需要记录下cnt12,cnt1,cnt2,iids1这些计算关键即可,其中iids2是用户邻居喜好的物品数组;数值类型可累加更新、

数组类型合并起来比较麻烦,一种解决方案是注册UDF;这里采取另一种这种的方案:把iids1合并成字符串,过滤的时候再分割为字符串数组。

with tb_behavior_sample_incr as (     select uid,iid      from (         select uid             ,iid             ,row_number() over(partition by iid order by rand()) feed_rn         from tb_behavior_incr     ) bh     where feed_rn <= 50000 )   insert overwrite table tb_neighbour select uid1,uid2,sim from (     select uid1         ,uid2         ,sum(cnt12) / sqrt(sum(cnt1)*sum(cnt2)) sim         ,row_number() over(partition by uid1 order by sum(cnt12) / sqrt(sum(cnt1)*sum(cnt2)) desc) sim_rn     from (         select uid1,uid2,cnt12,cnt1,cnt2         from tb_neighbour         uNIOn all         select a.uid uid1             ,b.uid uid2             ,count(a.iid) cnt12              ,cnt1             ,cnt2         from tb_behavior_sample_incr a         join tb_behavior_sample_incr b         on a.iid = b.iid         where a.uid <> b.uid         group by a.uid,b.uid      ) a12     join (select uid,count(iid) cnt1 from tb_behavior_incr group by uid) a1     on a12.uid1 = a1.uid     join (select uid,count(iid) cnt2 from tb_behavior_incr group by uid) a2     on a12.uid1 = a2.uid     group by uid1,uid2 ) tb_neighbour where sim > 0.1 and sim_rn <= 30

其中tb_behavior_sample_incr,tb_behavior_incr是相应tb_behavior_sample,tb_behavior的增量表;使用union all和group by聚合相同用户对的结果

kappa架构初次计算即是增量,不断累积每次增量的结果更新tb_neighbour;相当于lambda初始全量计算的一种回放,直至追到最新的时间分区。

insert overwrite table tb_user_consume select uid,substring_index(concat_ws(",",collect_list(iids1)),",",10000) iids1  from (     select uid,concat_ws(",",collect_set(cast(iid as string))) iids1     from tb_behavior_incr     union all     select uid,iids1     from tb_user_consume ) a group by uid  select uid1,iid from (     select uid1         ,iid         ,max(sim) score         ,row_number() over(partition by uid1 order by max(sim) desc) user_rn     from tb_neighbour a12     join (select uid,cast(iid as string) iid from tb_behavior_incr) a2     on a12.uid2 = a2.uid     join (select uid,split(iids1,",") iids1 from tb_user_consume) a1     on a12.uid1 = a1.uid     where not array_contaions(iids1,a2.iid)     group by uid1,iid ) tb_rec where user_rn <= 500

使用tb_user_consume缓存用户最近消费的前10000条记录,将用户邻居最新喜好物品推荐给用户。

感谢你能够认真阅读完这篇文章,希望小编分享的“SQL如何快速实现UCF”这篇文章对大家有帮助,同时也希望大家多多支持编程网,关注编程网VUE频道,更多相关知识等着你来学习!

--结束END--

本文标题: SQL如何快速实现UCF

本文链接: https://lsjlt.com/news/81859.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • SQL如何快速实现UCF
    这篇文章主要介绍了SQL如何快速实现UCF,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。SQLselect uid1,u...
    99+
    2024-04-02
  • 如何快速上手SQL
    这篇文章主要为大家展示了“如何快速上手SQL”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“如何快速上手SQL”这篇文章吧。两张示例表为了方便练习SQL语法,特地...
    99+
    2024-04-02
  • 如何快速掌握Fink SQL
    这篇文章主要讲解了“如何快速掌握Fink SQL”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“如何快速掌握Fink SQL”吧!1、导入所需要的的依赖包&l...
    99+
    2024-04-02
  • MySQL如何快速定位慢SQL的实战
    目录开启慢查询日志系统变量修改配置文件设置全局变量分析慢查询日志mysqldumpslowpt-query-digest开启慢查询日志 在项目中我们会经常遇到慢查询,当我们遇到慢查询...
    99+
    2024-04-02
  • web如何实现快速排序
    这篇文章主要为大家展示了“web如何实现快速排序”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“web如何实现快速排序”这篇文章吧。快速排序是对冒泡排序的一种改进。它的基本思想是:通过一次排序将要...
    99+
    2023-06-27
  • Python如何实现快速排序
    这篇文章主要介绍“Python如何实现快速排序”,在日常操作中,相信很多人在Python如何实现快速排序问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Python如何实现快速排序”的疑惑有所帮助!接下来,请跟...
    99+
    2023-06-04
  • SEO如何实现快速排名
    这篇文章主要为大家展示了“SEO如何实现快速排名”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“SEO如何实现快速排名”这篇文章吧。邮箱,可以使用雅虎的替身邮(不知道的百度)跟10分钟邮箱(10m...
    99+
    2023-06-10
  • java中如何实现快速排序
    下面由java入门学习栏目为大家介绍java中如何实现快速排序,希望这种算法排序可以帮助到大家!快速排序的时间复杂度并不固定,如果在最坏情况下(在一个原本逆向排序的数列中选择第一个元素为基准元素)速度比较慢,达到 O(n^2)(和选择排序一...
    99+
    2018-05-13
    java基础 java 快速排序 实现
  • Shiro在springboot中如何快速实现
    这篇“Shiro在springboot中如何快速实现”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“Shiro在springb...
    99+
    2023-07-05
  • MySQL实战记录之如何快速定位慢SQL
    目录开启慢查询日志系统变量修改配置文件设置全局变量分析慢查询日志mysqldumpslowpt-query-digest用法实战总结开启慢查询日志 在项目中我们会经常遇到慢查询,当我...
    99+
    2024-04-02
  • C++如何实现数独快速求解
    这篇文章主要介绍“C++如何实现数独快速求解”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“C++如何实现数独快速求解”文章能帮助大家解决问题。什么是数独数独是源自18世纪瑞士的一种数学游戏。是一种运...
    99+
    2023-06-29
  • C#如何实现快速查询文件
    今天小编给大家分享一下C#如何实现快速查询文件的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。相信使用过Everything的...
    99+
    2023-07-02
  • java如何实现快速排序算法
    这篇文章将为大家详细讲解有关java如何实现快速排序算法,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。快速排序算法使用的分治法策略来把一个序列分为两个子序列来实现排序的思路:1.从数列中挑出一个元素,称为...
    99+
    2023-06-02
  • C语言如何实现快速排序
    今天小编给大家分享一下C语言如何实现快速排序的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。交换排序的思想基本思想:所谓交换,...
    99+
    2023-07-02
  • Go Http Server框架如何快速实现
    这篇“Go Http Server框架如何快速实现”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“Go Http Server...
    99+
    2023-07-04
  • Solr快速实现
        在一些项目中,为了提高搜索的效率,一般都会使用外来工具,比如现在流行的ES、SOLR等等的工具,实现业务的模糊等搜索的快速反映。对于如何结合MySQL等操作略,具体可以查看网络相...
    99+
    2024-04-02
  • 如何快速入门SQL Server XML查询
    本篇文章给大家分享的是有关如何快速入门SQL Server XML查询,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。sql xml 入门: -...
    99+
    2024-04-02
  • 如何快速了解SQL窗口函数
    这篇文章主要介绍“如何快速了解SQL窗口函数”,在日常操作中,相信很多人在如何快速了解SQL窗口函数问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”如何快速了解SQL窗口函数”...
    99+
    2024-04-02
  • 如何快速通过Docker安装SQL Server
    目录一、拉取镜像二、运行容器三、进入容器(1)进入容器 (2)连接数据库 (3)查询数据库 (4) 创建数据库四、远程连接五、简单小结 本文教...
    99+
    2023-05-20
    docker 安装sqlserver sqlserver安装教程 docker sqlserver
  • MySQL Workbench如何快速引入sql文件
    概述:肯定有很多同学刚接触数据库时不懂如何将拿到的sql文件导入数据库,因此在这里介绍一个使用MySQL Workbench导入sql文件的方法还有一些注意事项。 一、打开MySQL Workbench 首先安装完mysql全家桶后,打开开...
    99+
    2023-08-24
    sql
软考高级职称资格查询
推荐阅读
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作