基于PySpark和ALS算法实现基本的电影推荐流程
文章目录1、PySpark简介2、Pyspark接口用法读取数据源常用算子完整的wordcount示例3、基于PySpark和ALS的电影推荐流程数据集背景读取用户数据训练模型调用已训练的模型完整代码项目难点说明小结本文内容第一部分给出Pyspark常见算子的用法,第二部分则参考书籍《Python spark2.0 Hadoop机器学习与大数据实战》的电影推荐章节。本文内容为大数据实时分析项目提供基本的入门知识。1、PySpark简介本节内容的图文一部分参考了这篇文章《PySpark 的背后原理 》,个人欣赏此博客作者,博文质量高,看完受益匪浅!Spark的内容不再累赘,可参考本博客《深入理解Spark》。PySpark的工作原理图示如下:在这里,Py4J 是一个用 Python 和 Java 编写的库,它可以让Python代码实现动态访问JVM的Java对象,同时JVM也能够回调 Python对象。因此PySpark就是在Spark外围包装一层Python API,借助Py4j实现Python和Java的交互(这里的交互就是通过socket实现,传字节码),进而实现通过Python编写Spark应用程序。在Driver端,PySparkContext通过Py4J启动一个JVM并产生一个JavaSparkContext;在Executor端,则不需要借助Py4j,因为Executor端运行的是由Driver传过来的Task业务逻辑(其实就是java的字节码)。2、Pyspark接口用法读取数据源PySpark支持多种数据源读取,常见接口如下:sc.pickleFile()# class 'pyspark.rdd.RDD'sc.textFile()# class 'pyspark.rdd.RDD'spark.read.json()# class 'pyspark.sql.dataframe.DataFrame'spark.read.text()# class 'pyspark.sql.dataframe.DataFrame'例如读取本地要注意,格式为file://+文件绝对路径sc.textFile("file:///home/mparsian/dna_seq.txt")# 读取hdfs上文件数据sc.textFile("your_hadoop/data/moves.txt")常用算子Spark的算子分为两类:Transformation和Action。Transformation仅仅是定义逻辑,并不会立即执行,有lazy特性,目的是将一个RDD转为新的RDD,可以基于RDDs形成lineage(DAG图);Action:触发Job运行,真正触发driver运行job;第一类算子:Transformationmap(func): 返回一个新的RDD,func会作用于每个map的key,例如在wordcount例子要rdd.map(lambda a, (a, 1))将数据转换成(a, 1)的形式以便之后做reduceword_rdd=sc.parallelize(["foo","bar","foo","pyspark","kafka","kafka",10,10])word_map_rdd=word_rdd.map(lambdaw:(w,1))mapping=word_map_rdd.collect()print(mapping)#输出[('foo',1),('bar',1),('foo',1),('pyspark',1),('kafka',1),('kafka',1),(10,1),(10,1)]mappartitions(func, partition): Return a new RDD by applying a function to each partition of this RDD.和map不同的地方在于map的func应用于每个元素,而这里的func会应用于每个分区,能够有效减少调用开销,减少func初始化次数。减少了初始化的内存开销。例如将一个数据集合分成2个区,再对每个区进行累加,该方法适合对超大数据集合的分区累加处理,例如有1亿个item,分成100个分区,有10台服务器,那么每台服务器就可以负责自己10个分区的数据累加处理。官方也提到mappartitions中如果一个分区太大,一次计算的话可能直接导致内存溢出。rdd=sc.parallelize([10,22,3,4],2)deff(each_partition):yieldsum(each_partition)rdd.glom().collect()#输出:[[10,22],[3,4]]rdd.mapPartitions(f).glom().collect()[[32],[7]]filter(func): 返回一个新的RDD,func会作用于每个map的key,用于筛选数据集rdd=sc.parallelize(["fooo","bbbar","foo"," ","Aoo"])rdd.filter(lambdax:'foo'inx).collect()# ['fooo', 'foo']flatMap(func): 返回一个新的RDD,func用在每个item,并把item切分为多个元素返回,例如wordcount例子的分类rdd=sc.parallelize(["this is pyspark","this is spark"])rdd.flatMap(lambdaline:line.split(' ')).collect()#可以看到每个item为一句话,经过func后,分解为多个单词(多个元素)# ['this', 'is', 'pyspark', 'this', 'is', 'spark']rdd=sc.parallelize((1,2,3))rdd.flatMap(lambdax:(2*x,3*x)).collect()# 对原来每个item分别乘2乘3,func返回两个item# [2, 3, 4, 6, 6, 9]flatMapValues(func):flatMapValues类似于mapValues,不同的在于flatMapValues应用于元素为key-value对的RDD中Value。每个一kv对的Value被输入函数映射为一系列的值,然后这些值再与原RDD中的Key组成一系列新的KV对。rdd=sc.parallelize([("name",["foo","bar","aoo"]),("age",["12","20"])])rdd.flatMapValues(lambdax:x).collect()# 输出结果[('name','foo'),('name','bar'),('name','aoo'),('age','12'),('age','20')]mapValues(func): 返回一个新的RDD,对RDD中的每一个value应用函数func。rdd=sc.parallelize([("name",["foo","bar","aoo"]),("age",["12","20"])])rdd.mapValues(lambdavalue:len(value)).collect()# [('name', 3), ('age', 2)]distinct(): 去除重复的元素rdd=sc.parallelize([("a",1),("a",10),("b",1),("a",1)])rdd.distinct().collect()# [('a', 1), ('a', 10), ('b', 1)]subtractByKey(other): 删除在RDD1与RDD2的key相同的项rdd1=sc.parallelize([("a",1),("a",10),("b",1),("a",1)])rdd2=sc.parallelize([("a",1),("a",10),("c",1),("a",1)])rdd1.subtractByKey(rdd2).collect()# [('b', 1)]subtract(other): 取差集rdd1=sc.parallelize([("a",1),("a",10),("b",1),("a",1)])rdd2=sc.parallelize([("a",1),("a",10),("c",1),("a",1)])rdd1.subtract(rdd2).collect()# [('b', 1)]intersection(other): 交集运算,保留在两个RDD中都有的元素rdd1=sc.parallelize([("a",1),("a",10)

相关新闻

航空发动机3D打印技术突破与应用解析

航空发动机3D打印技术突破与应用解析

1. 项目概述:航空发动机增材制造技术突破的意义 航空发动机被誉为现代工业"皇冠上的明珠",其制造水平直接体现了一个国家的工业实力。传统制造工艺在应对复杂结构件时往往面临周期长、成本高、材料利用率低等痛点。3D打印技术(增材…

2026/7/28 21:34:58阅读更多 →
java 大数据 分批+线程处理

java 大数据 分批+线程处理

背景&#xff1a;考虑到数据大&#xff0c;就会超时。解决方法&#xff1a;1.先把数据分批&#xff0c;2.在加入线程异步处理。代码如下&#xff1a;public static void main(String[] args) {//1.先把数据分批List<List<String>> batchList this.splitListToList…

2026/7/28 21:34:58阅读更多 →
赢家通吃!镜像视界、黎阳之光、潭龙东海掀起寡头绞杀战,视频孪生行业告别野蛮生长

赢家通吃!镜像视界、黎阳之光、潭龙东海掀起寡头绞杀战,视频孪生行业告别野蛮生长

赢家通吃&#xff01;镜像视界、黎阳之光、潭龙东海掀起寡头绞杀战&#xff0c;视频孪生行业告别野蛮生长技术解析白皮书文档版本&#xff1a;V1.0 编制单位&#xff1a;镜像视界&#xff08;浙江&#xff09;科技有限公司 技术依托&#xff1a;国家十四五重点课题专项成果、华…

2026/7/28 21:34:58阅读更多 →
能源路由器厂商全景解析:技术路线、核心产品与选型参考

能源路由器厂商全景解析:技术路线、核心产品与选型参考

随着AI数据中心单机柜功耗从8kW向120kW甚至更高水平跃升&#xff0c;传统AC 10kV/380V工频变压器加UPS的供电模式正面临越来越大的压力。低压大电流带来的线损、散热和布线难题&#xff0c;驱动行业加速探索从"多级变换"向"一级直供"的架构演进。在这一背景…

2026/7/28 22:41:20阅读更多 →
Poppins字体完整指南:如何免费获取这款现代几何无衬线字体

Poppins字体完整指南:如何免费获取这款现代几何无衬线字体

Poppins字体完整指南&#xff1a;如何免费获取这款现代几何无衬线字体 【免费下载链接】Poppins Poppins, a Devanagari Latin family for Google Fonts. 项目地址: https://gitcode.com/gh_mirrors/po/Poppins Poppins是一款结合了天城文和拉丁文的现代几何无衬线字体…

2026/7/28 22:41:20阅读更多 →
提供一些高密度UPS的具体型号:智算时代兆瓦级供电方案选型深度解析

提供一些高密度UPS的具体型号:智算时代兆瓦级供电方案选型深度解析

数据中心正在经历一场以功率密度为核心的系统级重构。单机柜功耗从过去的5至8kW跃升至40至120kW甚至更高&#xff0c;一个万卡GPU集群的供电需求轻松突破数兆瓦。在这种趋势下&#xff0c;高密度UPS已经从可选项变为智算中心配电架构中的核心决策项。了解当前市场上主流高密度U…

2026/7/28 22:41:20阅读更多 →
企业办公AI系统定制服务商本地部署与文档智能开发方案推荐

企业办公AI系统定制服务商本地部署与文档智能开发方案推荐

要说我们公司最头疼的事儿&#xff0c;文档处理绝对排前三。销售合同、采购合同、技术文档、客户资料、内部制度……每年光是处理这些文档的人力成本就大几十万。而且最要命的是&#xff0c;很多文档还涉及商业机密&#xff0c;绝对不能外传。所以当我开始找企业办公AI系统定制…

2026/7/28 22:41:20阅读更多 →
免费终极指南:如何快速部署本地化Meta-Llama-3.1-8B-Instruct-GGUF大语言模型

免费终极指南:如何快速部署本地化Meta-Llama-3.1-8B-Instruct-GGUF大语言模型

免费终极指南&#xff1a;如何快速部署本地化Meta-Llama-3.1-8B-Instruct-GGUF大语言模型 【免费下载链接】Meta-Llama-3.1-8B-Instruct-GGUF 项目地址: https://ai.gitcode.com/hf_mirrors/bartowski/Meta-Llama-3.1-8B-Instruct-GGUF 你是否厌倦了依赖云端AI服务的高…

2026/7/28 22:41:20阅读更多 →
M9A自动化引擎架构解析:如何构建基于图像识别的游戏智能代理系统

M9A自动化引擎架构解析:如何构建基于图像识别的游戏智能代理系统

M9A自动化引擎架构解析&#xff1a;如何构建基于图像识别的游戏智能代理系统 【免费下载链接】M9A 重返未来&#xff1a;1999 小助手 | Assistant For Reverse: 1999 项目地址: https://gitcode.com/gh_mirrors/m9/M9A M9A是基于MaaFramework图像识别框架构建的《重返未…

2026/7/28 22:39:20阅读更多 →
覆盖国产 + 海外 + 开源模型,OpenClaw 2.7.9 Windows/Mac 双端部署详解

覆盖国产 + 海外 + 开源模型,OpenClaw 2.7.9 Windows/Mac 双端部署详解

&#x1f539; 工具基础介绍 OpenClaw 是开源生态中一款实用性较强的本地智能工具&#xff0c;凭借本地离线运行、可视化图形操作和任务自动化三大核心特性&#xff0c;赢得了众多用户的青睐。与普通在线对话AI工具不同&#xff0c;它属于能够直接操控本机软硬件的智能数字员工…

2026/7/28 4:06:39阅读更多 →
伺服阀焊完微漏毁整机?精密激光焊接三关锁住高压

伺服阀焊完微漏毁整机?精密激光焊接三关锁住高压

所谓液压伺服阀体的精密激光焊接&#xff0c;是用激光束对阀座壳体&#xff08;通常为不锈钢或铝合金&#xff09;进行密封焊接&#xff0c;使阀体在21-35MPa的高压液压油或压缩气体中长期运行而不发生介质泄漏。液压伺服阀是高端液压系统的"大脑"。从航空航天飞行控…

2026/7/28 2:08:06阅读更多 →
D2DX:三步实现《暗黑破坏神2》高清宽屏体验的终极指南

D2DX:三步实现《暗黑破坏神2》高清宽屏体验的终极指南

D2DX&#xff1a;三步实现《暗黑破坏神2》高清宽屏体验的终极指南 【免费下载链接】d2dx D2DX is a complete solution to make Diablo II run well on modern PCs, with high fps and better resolutions. 项目地址: https://gitcode.com/gh_mirrors/d2/d2dx 你是否还在…

2026/7/28 1:38:28阅读更多 →
告别臃肿!3步让你的暗影精灵笔记本重获新生

告别臃肿!3步让你的暗影精灵笔记本重获新生

告别臃肿&#xff01;3步让你的暗影精灵笔记本重获新生 【免费下载链接】OmenSuperHub Control Omen laptop performance, fan speeds, and keyboard lighting, and unlock power limits. 项目地址: https://gitcode.com/gh_mirrors/om/OmenSuperHub 你是否也曾为官方Om…

2026/7/28 0:00:29阅读更多 →
RAG必踩坑!财报法规检索不准?这款开源工具让答案浮出水面,准确率飙升98.7%!

RAG必踩坑!财报法规检索不准?这款开源工具让答案浮出水面,准确率飙升98.7%!

做 RAG 的人应该都踩过这个致命的坑&#xff1a;把几百页的财报、法规、技术手册扔给向量库&#xff0c;问一个具体问题&#xff0c;搜出来的全是沾边但没用的内容 —— 关键信息要么被硬切块拆碎了&#xff0c;要么藏在几十条结果的最下面。语义相似≠真正相关&#xff0c;这个…

2026/7/28 0:00:29阅读更多 →
抖音视频文案提取工具全指南:免费2026版、手机App、在线工具一网打尽

抖音视频文案提取工具全指南:免费2026版、手机App、在线工具一网打尽

2026年做短视频运营&#xff0c;从抖音上扒文案早就不是偷偷抄笔记的事了。我刚开始做内容的时候&#xff0c;每天刷半小时抖音&#xff0c;手动把爆款视频的口播敲进备忘录&#xff0c;一条2分钟的视频得花十来分钟&#xff0c;碰到语速快的还要反复回听。后来试了一圈工具&am…

2026/7/28 0:00:29阅读更多 →
YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

如果你在部署 YOLOv8 时&#xff0c;发现推理速度只有可怜的 1-2 FPS&#xff0c;而别人的演示视频却能跑到 30 FPS 以上&#xff0c;那么问题很可能不在模型本身&#xff0c;而在于你的整个处理链路。很多开发者拿到一个训练好的 YOLOv8 模型后&#xff0c;会直接使用官方示例…

2026/7/28 20:22:24阅读更多 →
Coze与Dify对比指南:低代码AI应用开发从入门到实战

Coze与Dify对比指南:低代码AI应用开发从入门到实战

1. 从零到一&#xff1a;为什么你需要了解 Coze 和 Dify&#xff1f;如果你对 AI 应用开发感兴趣&#xff0c;但一看到“大模型”、“智能体”、“工作流”这些词就头疼&#xff0c;觉得门槛太高&#xff0c;那这篇文章就是为你准备的。很多开发者&#xff0c;包括我自己&#…

2026/7/28 3:17:03阅读更多 →
AI生图工具怎么选?2026年6月版实测对比

AI生图工具怎么选?2026年6月版实测对比

做自媒体的朋友应该都有体会&#xff1a;配图一直是个让人头疼的问题。2026年&#xff0c;AI生图工具已经非常成熟了&#xff0c;但工具太多反而不知道怎么选。以下是截至2026年6月我对主流AI生图工具的实测对比。Midjourney V8.1&#xff1a;速度之王2026年6月11日&#xff0c…

2026/7/28 2:35:58阅读更多 →