一、基于用户的Jaccard相似度公式

其中,u、v表示任意两个用户,N(u)表示用户u喜欢的物品集合,N(v)表示用户v喜欢物品的集合。

代码

public class UserCFApp {public static void main(String[]args){SparkConf sparkConf = new SparkConf();sparkConf.setAppName("UserCFApp");sparkConf.setMaster("local[*]");SparkSession sparkSession = SparkSession.builder().config(sparkConf).getOrCreate();String url = "jdbc:mysql://localhost:3306/spark-mysql?useUnicode=true&characterEncoding=utf8&autoReconnect=true&failOverReadOnly=false";String driver = "com.mysql.jdbc.Driver";String user = "root";String password = "admin";Dataset<Row> dataset = sparkSession.read().format("jdbc").option("driver", driver).option("url",url).option("dbtable","user_item").option("user",user).option("password",password).load();Dataset<Row> userCount = dataset.groupBy("user_id").count();Dataset<Row> user2UserCount = dataset.as("a").join(dataset.as("b"),functions.column("a.item_id").$eq$eq$eq(functions.column("b.item_id"))).where(functions.column("a.user_id").notEqual(functions.column("b.user_id"))).select(functions.column("a.user_id").as("a_user_id"),functions.column("b.user_id").as("b_user_id")).groupBy("a_user_id", "b_user_id").count();Dataset<Row> result =  user2UserCount.as("u2u").join(userCount.as("uc1"), functions.column("u2u.a_user_id").$eq$eq$eq(functions.column("uc1.user_id"))).join(userCount.as("uc2"), functions.column("u2u.b_user_id").$eq$eq$eq(functions.column("uc2.user_id"))).selectExpr("u2u.a_user_id", "u2u.b_user_id", "u2u.count/(uc1.count + uc2.count - u2u.count) as count");result.show();
//        result.write()
//                .mode(SaveMode.Overwrite)
//                .format("jdbc")
//                .option("driver", driver)
//                .option("url",url)
//                .option("dbtable","user_similar")
//                .option("user",user)
//                .option("password",password)
//                .save();sparkSession.stop();}
}

二、基于用户的余弦相似度公式

其中,u、v表示任意两个用户,N(u)表示用户u喜欢的物品集合,N(v)表示用户v喜欢物品的集合。

public class UserCF2App {public static void main(String[]args){SparkConf sparkConf = new SparkConf();sparkConf.setAppName("UserCFApp");sparkConf.setMaster("local[*]");SparkSession sparkSession = SparkSession.builder().config(sparkConf).getOrCreate();String url = "jdbc:mysql://localhost:3306/spark-mysql?useUnicode=true&characterEncoding=utf8&autoReconnect=true&failOverReadOnly=false";String driver = "com.mysql.jdbc.Driver";String user = "root";String password = "admin";Dataset<Row> dataset = sparkSession.read().format("jdbc").option("driver", driver).option("url",url).option("dbtable","user_item").option("user",user).option("password",password).load();Dataset<Row> userCount = dataset.groupBy("user_id").count();Dataset<Row> user2UserCount = dataset.as("a").join(dataset.as("b"),functions.column("a.item_id").$eq$eq$eq(functions.column("b.item_id"))).where(functions.column("a.user_id").notEqual(functions.column("b.user_id"))).select(functions.column("a.user_id").as("a_user_id"),functions.column("b.user_id").as("b_user_id")).groupBy("a_user_id", "b_user_id").count();Dataset<Row> result =  user2UserCount.as("u2u").join(userCount.as("uc1"), functions.column("u2u.a_user_id").$eq$eq$eq(functions.column("uc1.user_id"))).join(userCount.as("uc2"), functions.column("u2u.b_user_id").$eq$eq$eq(functions.column("uc2.user_id"))).selectExpr("u2u.a_user_id", "u2u.b_user_id", "u2u.count/pow(uc1.count * uc2.count, 0.5) as count");result.show();
//        result.write()
//                .mode(SaveMode.Overwrite)
//                .format("jdbc")
//                .option("driver", driver)
//                .option("url",url)
//                .option("dbtable","user_similar")
//                .option("user",user)
//                .option("password",password)
//                .save();sparkSession.stop();}
}

Spark SQL(七)之基于用户的相似度公式相关推荐

  1. 基于物品的相似度还是基于用户的相似度

    基于物品的相似度计算的时间会随着物品数量的增加而增加,基于用户的相似度计算的时间则会随着用户数量的增加而增加.如果有一个商店,那么最多会有几千件商品.如果用户数量很多,可能倾向于使用基于物品相似度的计 ...

  2. Spark SQL(八)之基于物品的相似度公式

    一.基于物品的Jaccard相似度公式 其中,i.j表示任意两个物品,N(i)表示喜欢物品i的用户数,N(j)表示喜欢物品j的用户数. 代码: public class ItemCFApp {publ ...

  3. 大数据Hadoop之——Spark SQL+Spark Streaming

    文章目录 一.Spark SQL概述 二.SparkSQL版本 1)SparkSQL的演变之路 2)shark与SparkSQL对比 3)SparkSession 三.RDD.DataFrames和D ...

  4. Spark生态系统解析及基于Redis的开源分布式服务Codis

    摘要:在第九期"七牛开发者最佳实践日"上,陈超就Spark整个生态圈进行了讲解,而刘奇则分享豌豆荚在Redis上的摸索和实践. 1月24日,一场基于Spark和Redis组成的分布 ...

  5. hive编程指南电子版_第三篇|Spark SQL编程指南

    在<第二篇|Spark Core编程指南>一文中,对Spark的核心模块进行了讲解.本文将讨论Spark的另外一个重要模块--Spark SQL,Spark SQL是在Shark的基础之上 ...

  6. Spark SQL玩起来

    标签(空格分隔): Spark [toc] 前言 Spark SQL的介绍只包含官方文档的Getting Started.DataSource.Performance Tuning和Distribut ...

  7. spark-sql建表语句限制_第三篇|Spark SQL编程指南

    在<第二篇|Spark Core编程指南>一文中,对Spark的核心模块进行了讲解.本文将讨论Spark的另外一个重要模块--Spark SQL,Spark SQL是在Shark的基础之上 ...

  8. hive编程指南_第三篇|Spark SQL编程指南

    在<第二篇|Spark Core编程指南>一文中,对Spark的核心模块进行了讲解.本文将讨论Spark的另外一个重要模块--Spark SQL,Spark SQL是在Shark的基础之上 ...

  9. Spark SQL: Relational Data Processing in Spark

    Spark SQL: Relational Data Processing in Spark Spark SQL : Spark中关系型处理模块 说明: 类似这样的说明并非是原作者的内容翻译,而是本篇 ...

最新文章

  1. ASP.NET3种验证码[转]
  2. IE8-开发人员工具使用(一)
  3. Python 面向对象【1】
  4. 汇编语言 -第十一章
  5. 计算机学校教学大纲,中等职业学校计算机应用基础教学大纲
  6. 计算机等级考试真题演示,全国计算机等级考试二级真题测试(答案)四、演示文稿题-日...
  7. 文件服务器ping延时大,windowns 2008 ping 127.0.0.1延迟大的解决方法。
  8. 算法基础知识(考试复习)
  9. ICCV NAS Workshop 最佳论文提名:通过层级掩码实现高效神经网络架构搜索
  10. Mac 长截图/长截屏
  11. 项目的三种组织结构形式分析与比较
  12. 将图片放大如何保持图片的清晰度?
  13. 2021最新百度、头条等公司Android面试题目,附小技巧
  14. sqlmap用户手册详解【实用版】
  15. 关于数组名(arr)的理解
  16. 进击3D游戏界!Cocos Creator快速实现骨骼动画交互!
  17. Flutter商城项目实战(商品分类)
  18. c语言输出问句接受一个答案,浅谈学习C语言的经过
  19. 解析圆—-智能手表UI设计理念
  20. Android中实现蓝牙录放音

热门文章

  1. 5120v2怎么配置web登陆_阿里企业邮箱如何配置和添加到第三个电子邮件客户端中?...
  2. 值得关注的HTML基础
  3. mysql表缓冲大小可能设置过小_MySQL 5.7 my.cnf配置文件详解
  4. 简述tcp协议三报文握手过程_TCP协议中的三次握手和四次挥手(图解)
  5. [数据结构]邻接矩阵和邻接表存储的图DFS,BFS算法时间复杂度分析
  6. 线性表的定义与操作-顺序表,链式表(C语言)
  7. [JavaWeb-Tomcat]web服务器软件_Tomcat介绍
  8. AcWing 1234. 倍数问题
  9. Good Number Gym - 102769G 2020年CCPC秦皇岛分站赛
  10. php 如何生成二级目录json,使用PHP根据已解码的JSON创建文件夹/文件结构