Spark实现PageRank算法

详细步骤:

1、创建Spark sql 环境

2、读取数据

3、数据切分 (分为page列,outLink列)形成表 pageDF

4、新增pr一列  (给定初始值)    形成表 initPrDF

5、新增avgPr一列(根据出链关系,求每个页面所分到的Pr)

6、分组聚合 (将outLink列explode炸开,在按照page分组,然后sum求和,这就是表 newPrDF

7、两表关联(newPrDF.join initPrDF),求pr列的差值平均数,形成列 avgDiffDF

8、if判断,取出avgDiffDF的值,与0.001比较,小于0.001循环结束

9、循环赋值,initPrDF=newPrDF,这样每次循环都能与上一次的进行比较

代码实现:

import org.apache.spark.sql.{DataFrame, Row, SparkSession}import java.math.BigDecimal
object PageRank {def main(args: Array[String]): Unit = {/**网页关系表示* A,B|D* B,C* C,A|B* D,B|C* *///网页排名,先了解每个网页的入链和出链,然后用数据表示各个网页之间的关系//再循环迭代,编程计算PageRank公式,得到最终的收敛值,就是排名// TODO: PR公式:(1-q)/N + q*∑(Pr/L)// TODO: q为阻尼系数(q=0.85),N为网页数量, L为出链数量,Pr为初始值(给定为1,后面每次循环都用上一次的Pr为初始值)//创建Spark sql 环境val spark: SparkSession = SparkSession.builder().master("local").appName("pageRank").config("spark.sql.shuffle.partitions", 1).getOrCreate()//读取数据val pageRankDF: DataFrame = spark.read.format("csv").option("sep", ",").schema("page STRING,outLink STRING").load("spark/src/main/data/pageRank")import spark.implicits._import org.apache.spark.sql.functions._//进行数据切分val pageDF: DataFrame = pageRankDF.select($"page", split($"outLink", "\\|") as "outLink")//缓存pageDF.cache()//给定初始值var initPrDF: DataFrame = pageDF.withColumn("pr", expr("1.0"))var flag=trueval q=0.85//页面数量val N: Long = pageDF.count()while(flag){val newPrDF: DataFrame = initPrDF//计算每个页面平均分到的pr值.withColumn("avgPr", $"pr" / size($"outLink"))//一行变多行,将外链的数据都炸开,保留outLink和avgPr,因为后面要分组聚合.select(explode($"outLink") as "page", $"avgPr").groupBy($"page")//增加阻尼系数.agg(sum($"avgPr")* q + ( 1 - q ) / N as "pr")//关联原列表,为了求差值.join(pageDF, "page")//求该列表与上次一Pr的差值的平均值,最后如果小于0.001就收敛结束val avgDiffDF: DataFrame = newPrDF.as("a").join(initPrDF.as("b"), "page")//abs是求绝对值.withColumn("diffPr", abs($"a.pr" - $"b.pr")).agg(avg($"diffPr") as "avgDiff")//查看aggDiffDF的表结构,便于从列中取值avgDiffDF.printSchema()//取出差值平均值// TODO: 这个有个类型转换的问题,在没有修正的情况下,也就是不加阻尼系数时,//  会出现java.math.BigDecimal not cast to scala.math.BigDecimal,这里导一下java.BigDecimal的包就行
//    val row: Row = avgDiffDF.head()
//    val avgDiff: Double = row.getAs[BigDecimal]("avgDiff").doubleValue()// TODO: 加上阻尼系数后,就是正常的Double类型val row: Row = avgDiffDF.head()val avgDiff: Double = row.getAs[Double]("avgDiff").doubleValue()//收敛条件if(avgDiff<0.001){flag=false}//每次展示一下新的表newPrDF.show()//每次得到的新表作为初始表initPrDF=newPrDF}}}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/56726.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Visual studio 下载安装

1&#xff0c;Visual stutdio 网址 下载 Visual Studio Tools - 免费安装 Windows、Mac、Linux 2&#xff0c;下划页面&#xff0c;点击 较早的下载 3&#xff0c;选择对应的版本进行下载

《深度学习》YOLO v1网络架构 、损失值、NMS极大值抑制

目录 一、Yolo系列v1 1、核心思想 2、示例 3、流程图解析 二、YOLO系列v1损失函数 1、位置误差 2、置信度误差 3、类别概率损失 三、NMS非极大值抑制 1、概念 2、步骤 四、YOLO v1优缺点 1、优点 1&#xff09;速度快 2&#xff09;端到端 3&#xff09;多尺度…

docker 可用镜像服务地址(2024.10.25亲测可用)

1.错误 Error response from daemon: Get “https://registry-1.docker.io/v2/” 原因&#xff1a;镜像服务器地址不可用。 2.可用地址 编辑daemon.json&#xff1a; vi /etc/docker/daemon.json内容修改如下&#xff1a; {"registry-mirrors": ["https://…

Python爬虫:从入门到精通

Python爬虫&#xff1a;从入门到精通 在数字时代&#xff0c;信息就如同水源&#xff0c;源源不绝。然而&#xff0c;当你想要从海量的信息中汲取有价值的“水”&#xff0c;你会发现这并不是一件容易的事。这就是为什么网络爬虫出现了。它们帮助我们在网络的海洋中航行&#…

光伏业务管理软件:提升企业管理效率的利器

一、优化业务流程 光伏业务管理软件能够对企业的各项业务流程进行全面梳理和优化。从项目前期的规划设计、设备采购&#xff0c;到项目建设中的施工管理、质量控制&#xff0c;再到项目后期的运维服务&#xff0c;软件都可以进行有效的跟踪和管理。 通过规范业务流程&#xf…

力扣第23题:合并K个升序链表

详解力扣第23题&#xff1a;合并K个升序链表 题目描述 给你一个链表数组&#xff0c;每个链表都已经按升序排列。请你将所有链表合并到一个升序链表中&#xff0c;返回合并后的链表。 本题可以通过优先队列-最小堆来高效解决&#xff0c;因为我们需要频繁地找到当前K个链表中…

银行客户贷款行为数据挖掘与分析

#1024程序员节 | 征文# 在新时代下&#xff0c;消费者的需求结构、内容与方式发生巨大改变&#xff0c;企业要想获取更多竞争优势&#xff0c;需要借助大数据技术持续创新。本文分析了传统商业银行面临的挑战&#xff0c;并基于knn、逻辑回归、人工神经网络三种算法&#xff0…

2024 10.25 判断一个矩阵是否对称

主对角线对称 思路&#xff1a;a[i][j]!a[j][i] 第一行和第一列顺序比较&#xff0c;后面依次类推 #include <stdio.h>int main(){int n,m;scanf("%d",&n);int a[n][n];for(int i0;i<n;i){for(int j0;j<n;j)scanf("%d",&a[i][j]);}i…

Spring Boot框架下中小企业设备管理系统开发

1系统概述 1.1 研究背景 随着计算机技术的发展以及计算机网络的逐渐普及&#xff0c;互联网成为人们查找信息的重要场所&#xff0c;二十一世纪是信息的时代&#xff0c;所以信息的管理显得特别重要。因此&#xff0c;使用计算机来管理中小企业设备管理系统的相关信息成为必然。…

python的Django的render_to_string函数和render函数模板的使用

一、render_to_string render_to_string 是 Django 框架中的一个便捷函数&#xff0c;用于将模板渲染为字符串。 render_to_string(template_name.html, context, requestNone, usingNone) template_name.html&#xff1a;要渲染的模板文件的名称。context&#xff1a;传递给…

epub转为txt

使用Python通过ebooklib和BeautifulSoup等库将epub文件转换为txt文件。下 1.安装必要的依赖库&#xff1a; pip install ebooklib beautifulsoup4 lxmlimport ebooklib from ebooklib import epub from bs4 import BeautifulSoup import os# 读取epub文件并转换为txt文件 def …

新手入门之高级maven

文章目录 前言一、分模块设计与开发Maven 分模块设计的优势Maven 分模块设计的基本结构Maven 分模块项目的构建 二、继承与聚合三种打包方式&#xff1a;Maven 父模块和子模块的关系Maven 中的版本锁定1.<dependencyManagement> 标签主要特点&#xff1a; 2.使用 <pro…

刷题 - 图论

1 | bfs/dfs | 网格染色 200. 岛屿数量 访问到马上就染色&#xff08;将visited标为 true)auto [cur_x, cur_y] que.front(); 结构化绑定&#xff08;C17&#xff09;也可以不使用 visited数组&#xff0c;直接修改原始数组时间复杂度: O(n * m)&#xff0c;最多将 visited 数…

基于GPT的智能客服落地实践

&#x1f4cd;前言 在日常生活中&#xff0c;「客服」这个角色几乎贯穿着我们生活的方方面面。比如&#xff0c;淘宝买东西时&#xff0c;需要客服帮你解答疑惑。快递丢失时&#xff0c;需要客服帮忙找回。报名参加培训课程时&#xff0c;需要客服帮忙解答更适合的课程…… 基…

重构商业生态:DApp创新玩法与盈利模式的深度剖析

随着区块链技术的发展&#xff0c;DApp&#xff08;去中心化应用&#xff09;正在从实验走向成熟。DApp以去中心化、透明性和不可篡改性为基础&#xff0c;结合智能合约&#xff0c;逐步改变传统商业运作模式&#xff0c;创造新的市场生态。本文将从DApp的独特优势、创新玩法和…

找不到包的老版本???scikit-learn,numpy,scipy等等!!

废话不多说 直接上链接了&#xff1a; https://pypi.tuna.tsinghua.edu.cn/simple/https://pypi.tuna.tsinghua.edu.cn/simple/https://pypi.tuna.tsinghua.edu.cn/simple/xxx/ 后面的这个xxx就是包的名字 大家需要什么包的版本&#xff0c;直接输进去就可以啦 举个栗子&#…

【汇编语言】第一个程序(一)—— 一个源程序从写出到执行的过程

文章目录 前言1. 第一步&#xff1a;编写汇编源程序2. 第二步&#xff1a;对源程序进行编译连接3. 第三步&#xff1a;执行可执行文件中的程序结语 前言 &#x1f4cc; 汇编语言是很多相关课程&#xff08;如数据结构、操作系统、微机原理&#xff09;的重要基础。但仅仅从课程…

9. JSON RPC 服务

① JSON RPC 是一种基于 JSON 格式的轻量级的 RPC 协议标准,易于使用和阅读。 ② 在 Hyperf 里由 hyperf/json-rpc 组件来实现,可自定义基于 HTTP 协议来传输,或直接基于 TCP 协议来传输。 一、服务中心 目前 Hyperf 仅支持两种服务中心的组件支持: consul、nacosconsul 安…

了解 .NET 8 中的定时任务或后台服务:IHostedService 和 BackgroundService

IHostedService.NET 8 引入了使用和管理后台任务的强大功能BackgroundService。这些服务使长时间运行的操作&#xff08;例如计划任务、后台处理和定期维护任务&#xff09;可以无缝集成到您的应用程序中。本文探讨了这些新功能&#xff0c;并提供了实际示例来帮助您入门。您可…

物联网海量数据下的时序数据库选型:InfluxDB、TDEngine、MongoDB与HBase对比与建议

随着物联网&#xff08;IoT&#xff09;的普及&#xff0c;各行业纷纷部署大量传感器、设备生成的数据流&#xff0c;面对如此海量的时间序列数据&#xff0c;如何高效存储、查询和分析成为关键。为此&#xff0c;时序数据库&#xff08;Time Series Database, TSDB&#xff09…