Spark GraphX 机器学习:图计算
引言
在数字化时代,图数据(Graph Data)的价值日益凸显:社交网络中的用户关系、电商平台的商品关联、知识图谱的实体链接……这些以“节点(Vertex)”和“边(Edge)”为核心的非结构化数据,正成为挖掘复杂关系的关键。传统单机图计算工具难以应对海量数据的分布式处理需求,而Apache Spark生态中的GraphX模块,凭借其“分布式计算+机器学习集成”的特性,成为了工业界处理大规模图数据的优选方案。本文将深入解析Spark图计算的核心机制、典型场景及实践方法。
一、Spark图计算的核心:GraphX模块
GraphX 是 Spark 的核心组件之一,其核心抽象是弹性分布式属性图(Resilient Distributed Property Graph),通过将节点和边分别存储为 VertexRDD
和 EdgeRDD
,并支持与普通 RDD 的无缝转换。
GraphX是Spark专为图计算设计的分布式框架,其核心设计哲学是“将图数据与集合数据统一抽象”,既支持传统图操作(如邻接遍历、子图提取),又能无缝集成Spark的RDD、DataFrame等数据结构,实现图计算与机器学习的端到端流水线。
关键特性:
- 分布式存储优化:采用邻接表(Adjacency List)存储边数据,减少网络传输开销;
- Pregel API:支持迭代式图算法(如PageRank、最短路径),通过“消息传递”机制实现分布式计算;
- 与 RDD 集成:可直接对节点/边的属性进行 RDD 操作(如过滤、聚合),灵活扩展分析逻辑。
1.1 核心抽象:图(Graph)与属性化操作
GraphX的核心抽象是Graph[VD, ED]
,其中:
Graph[VD, ED]
:VD为节点属性类型,ED为边属性类型;VertexRDD[VD]
:节点的分布式集合,支持按ID快速查找;EdgeRDD[ED]
:边的分布式集合,存储源节点ID、目标节点ID及属性。
除了基础的图结构,GraphX还提供了两种优化的RDD视图:
VertexRDD[VD]
:基于节点ID优化的分布式节点集合,支持快速节点属性更新;EdgeRDD[ED]
:基于源/目标节点ID排序的边集合,支持高效的边过滤与聚合。
这种设计使得GraphX既能处理“节点-边”的关系逻辑,又能利用Spark的分布式计算能力(如并行化、容错机制),大幅提升大规模图数据的处理效率。
1.2 图计算的核心操作
GraphX提供了三类核心操作,覆盖图数据的全生命周期处理:
- 结构操作:如
subgraph
(提取子图)、reverse
(反转边方向)、mask
(按另一个图过滤节点/边); - 聚合操作:如
aggregateMessages
(基于消息传递的节点属性聚合)、groupEdges
(合并重复边); - 算法库:内置经典图算法(如PageRank、最短路径、标签传播LPA、强连通分量SCC),支持自定义算法扩展。
以PageRank为例,GraphX通过迭代计算每个节点的“影响力得分”,仅需几行代码即可实现分布式计算:
import org.apache.spark.graphx._
val graph: Graph[Double, Double] = GraphLoader.edgeListFile(spark.sparkContext, \"social_edges.txt\")
val ranks = graph.pageRank(0.0001).vertices // 迭代收敛阈值0.0001
ranks.foreach { case (id, rank) => println(s\"Node $id has rank: $rank\") }
2.2 GraphFrames:基于 DataFrame 的增强框架
GraphFrames 是 Databricks 开发的图计算库,基于 Spark DataFrame 构建,提供更丰富的 API 和更友好的查询能力(如模式匹配)。其核心优势在于:
- 声明式查询:支持类似 Neo4j Cypher 的模式匹配语法(如
graph.find("(a)-[e]->(b); (b)-[f]->(c)")
查找两步路径); - 与 MLlib 深度集成:可直接将图特征(如节点度、社区标签)作为机器学习模型的输入;
- 更完善的算法库:内置 LPA、PageRank、最短路径等算法,且支持增量计算。
提示:GraphX 适合对性能要求高的底层算法开发,而 GraphFrames 更适合需要灵活查询和机器学习集成的场景。
二、实战案例:基于 Spark 的社交网络好友推荐
3.1 场景描述
某社交平台需为用户推荐“可能认识的人”,目标是挖掘用户的潜在社交关系(如共同好友、兴趣重叠)。我们将使用 Spark GraphX 构建用户关系图,并通过 PageRank(衡量节点重要性)和 标签传播算法(LPA)(社区划分)实现推荐。
3.2 数据准备
假设我们有以下两类数据:
- 用户节点数据:
user_id, username, age
(存储为user.csv
); - 关系边数据:
src_id, dst_id, relation_strength
(存储为edges.csv
),其中relation_strength
表示好友关系的紧密程度(如互动频率)。
3.3 构建图结构
在 Spark 中读取数据并构建 Graph
对象:
import org.apache.spark.graphx._
import org.apache.spark.rdd.RDD// 读取用户节点(ID, 属性)
val users: RDD[(VertexId, (String, Int))] = spark.read.option("header", "true").csv("user.csv").rdd.map(row => (row.getAs[Long]("user_id"), (row.getAs[String]("username"), row.getAs[Int]("age"))))// 读取边数据(源ID, 目标ID, 权重)
val edges: RDD[Edge[Double]] = spark.read.option("header", "true").csv("edges.csv").rdd.map(row => Edge(row.getAs[Long]("src_id"), row.getAs[Long]("dst_id"), row.getAs[Double]("relation_strength")))// 构建属性图(缺失节点用默认值填充)
val graph: Graph[(String, Int), Double] = Graph(users, edges, ("unknown", 0))
3.4 计算节点重要性(PageRank)
PageRank 算法认为,一个节点的重要性由指向它的节点的重要性决定。在 GraphX 中,可直接调用 pageRank
方法:
// 计算PageRank(最大迭代10次,误差阈值0.001)
val pageRankGraph = graph.pageRank(0.001, 10)// 关联用户信息,输出Top10重要用户
val userRank = pageRankGraph.vertices.join(users).map {case (id, (rank, (name, age))) => (name, rank)
}
userRank.sortBy(-_._2).take(10).foreach(println)
3.5 社区划分(标签传播算法LPA)
LPA 算法通过节点间的标签传播,将紧密连接的节点划分到同一社区。GraphX 提供了 labelPropagation
方法:
// 运行LPA(最大迭代5次)
val lpaGraph = graph.labelPropagation(5)// 输出社区ID与用户的映射
lpaGraph.vertices.join(users).map {case (id, (communityId, (name, age))) => (communityId, name)
}.groupByKey().foreach {case (cid, names) => println(s"社区 $cid: ${names.mkString(", ")}")
}
3.6 推荐逻辑落地
结合 PageRank 和 LPA 结果,推荐策略可设计为:
- 对目标用户,优先推荐其所在社区内 PageRank 高的未关注用户;
- 若社区内用户已全部关注,则扩展至相邻社区的高重要性用户。
三、图计算在机器学习中的典型场景
图数据的本质是“关系建模”,而机器学习的核心是“从数据中学习模式”。Spark GraphX通过将图特征与传统机器学习特征融合,可显著提升模型对复杂关系的捕捉能力。以下是三个典型应用场景:
2.1 社交网络:用户行为预测与社区发现
社交网络的核心是用户间的连接关系。通过GraphX的标签传播算法(LPA),可快速识别用户社区(如“游戏爱好者”“职场用户”);结合用户属性(如年龄、发帖频率)和边属性(如互动次数),可构建分类模型预测用户的“高价值行为”(如付费、传播)。
案例:某社交平台通过GraphX分析10亿级用户关系图,使用LPA划分出2000+个社区,再基于社区特征(如平均活跃度、核心用户影响力)训练XGBoost模型,将用户付费预测准确率从72%提升至85%。
2.2 推荐系统:基于图的协同过滤
传统协同过滤依赖用户-商品的“共现矩阵”,而图计算可将其扩展为“用户-商品-标签”的异构图(Heterogeneous Graph)。通过GraphX的**随机游走(Random Walk)**生成节点序列,结合Word2Vec训练图嵌入(Graph Embedding),可捕捉隐含的关联模式。
实践:某电商平台将用户点击、购买、收藏行为转化为图边(用户→商品,权重为行为频率),通过GraphX的RandomWalk
生成节点路径,训练得到的商品嵌入向量用于双塔模型,推荐点击率提升18%。
2.3 生物信息学:蛋白质交互网络分析
在生物信息领域,蛋白质分子间的交互关系可建模为图(节点为蛋白质,边为交互强度)。通过GraphX的最短路径算法,可快速定位疾病相关的关键蛋白质;结合基因表达数据(节点属性),可构建回归模型预测药物靶点。
进展:某科研团队利用GraphX分析包含500万蛋白质节点的交互图,通过BFS
(广度优先搜索)找到阿尔茨海默病相关的3条关键路径,为药物研发提供了新靶点。
四、Spark图计算的工程实践建议
尽管GraphX功能强大,实际工程中仍需注意以下优化点:
- 数据分区策略:GraphX默认按边的目标节点ID分区(EdgePartition2D),对于“度分布不均”的图(如社交网络中的大V节点),建议使用
PartitionStrategy.RandomVertexCut
或自定义分区,避免数据倾斜; - 内存优化:图数据通常包含大量节点和边,可通过
Graph.unpersist()
及时释放不再使用的中间结果,或使用MemoryStore
的堆外内存模式减少GC压力; - 算法迭代控制:PageRank、LPA等迭代算法需设置合理的收敛阈值(如
tol=0.001
)和最大迭代次数(如maxIter=100
),平衡计算精度与耗时; - 与MLlib的集成:通过
VertexRDD
将图特征(如节点度数、PageRank得分)转换为DataFrame,可直接输入MLlib的逻辑回归、随机森林等模型,实现“图计算+传统机器学习”的融合。
结论
Spark GraphX作为分布式图计算的“瑞士军刀”,凭借其与Spark生态的深度集成(支持从数据加载、图处理到机器学习的全流程),已成为处理大规模图数据的首选工具。随着图神经网络(GNN)的兴起,Spark社区也在探索与GraphX的结合(如通过GraphFrames
支持更灵活的图查询)。未来,图计算与机器学习的深度融合,将为社交、电商、生物等领域带来更精准的关系挖掘与预测能力。
对于开发者而言,掌握GraphX的核心操作与优化技巧,不仅能解决实际业务中的图数据处理问题,更能为后续探索图机器学习(如GraphSAGE、GAT)奠定坚实基础。
相关文章:
Spark GraphX 机器学习:图计算
引言 在数字化时代,图数据(Graph Data)的价值日益凸显:社交网络中的用户关系、电商平台的商品关联、知识图谱的实体链接……这些以“节点(Vertex)”和“边(Edge)”为核心的非结构化…...
claude 3.7,极为均衡的“全能型战士”大模型,国内直接使用
文章目录 零、前言一、操作指南操作指导 二、小球弹跳三、生成 Mandelbrot set 集四、文本总结能力五、智力推理题六、感受 零、前言 Claude 3.7 Sonnet(下面简称 Claude 3.7)由 Anthropic 发布,“全球首个混合推理模型”的 AI 大模型&#x…...
机器学习-入门-决策树(1)
机器学习-入门-决策树(1) 4.1决策树的基本流程 决策树基于“树”结构进行决策 每个“内部结点”对应于某个属性上的“测试”(test)每个分支对应于该测试的一种可能结果(即该属性的某个取值)每个“叶结点”对应于一个“预测结果” 学习过程࿱…...
机器学习实操 第一部分 机器学习基础 第6章 决策树
机器学习实操 第一部分 机器学习基础 第6章 决策树 内容概要 第6章深入介绍了决策树,这是一种功能强大的机器学习算法,能够处理分类、回归以及多输出任务。决策树通过递归地分割数据集来构建模型,具有易于解释和可视化的特点。本章详细讲解…...
Python实例题:ebay在线拍卖数据分析
目录 Python实例题 题目 实现思路 代码实现 代码解释 read_auction_data 函数: clean_auction_data 函数: exploratory_analysis 函数: visualize_auction_data 函数: 主程序: 运行思路 注意事项 Python实…...
算法题(137):丢手绢
审题: 本题需要我们找到距离最远的两个孩子之间的距离,并打印 思路: 方法一:暴力枚举 我们可以找到每个孩子的距离其他孩子的最远距离,然后维护一个maxdis变量得到所有孩子距离其他孩子最远距离的最大值。 而距离分为顺…...
2025年具身智能科技研报
引言 本报告系统梳理了2025年具身智能领域的最新进展,基于国内外权威新闻源与行业研究报告,通过数据可视化与深度分析相结合的方式,呈现该领域多维发展态势。从技术突破层面看,多模态大模型的突破性进展为具身智能注入新动能&…...
TCL科技2025一季度归母净利润10.1亿,半导体显示业务业绩创新高
4月29日,TCL科技(000100)披露2024年年报及2025年一季报。2024全年,TCL科技实现营业收入1648亿元,归母净利润15.6亿元;实现经营现金流净额295亿元,同比增长16.6%。2025年一季度,TCL科…...
阿里云 CentOS YUM 源配置指南
阿里云 CentOS YUM 源配置指南 在使用 CentOS 7 时,由于 CentOS 官方源停止维护等原因,yum install 命令可能会报错 “Cannot find a valid baseurl for repo: centos-sclo-rh/x86_64”。以下是通过更换阿里云源解决该问题的详细步骤。 一、备份原有配…...
阿里云 OpenManus 实战:高效AI协作体系
阿里云 OpenManus 实战:高效AI协作体系 写在最前面初体验:快速部署,开箱即用 真实案例分享:从单体开发到智能良好提示词过程展示第一步:为亚马逊美国站生成商品描述第二步:为eBay全球站生成商品描述结果分析…...
阿里云服务迁移实战: 05-OSS迁移
概述 Bucket 复制分为两种,同区域复制和跨区域复制 同账号复制比较简单,根据提示填写信息即可,本文主要介绍跨账号复制。 同区域复制 授权角色选择 “AliyunOSSRole”, 创建方法见 “跨区域复制”。然后点击确定即可。 跨区域复制 假设我…...
Vue高级特性实战:自定义指令、插槽与路由全解析
一、自定义指令 1.如何自定义指令 ⑴.全局注册语法 通过 Vue.directive 方法注册,语法格式为: Vue.directive(指令名, {// 钩子函数,元素插入父节点时触发(仅保证父节点存在,不一定已插入文档)inserted(…...
Python入门:流程控制练习
本文将介绍Python中流程控制的基础知识,包括条件判断和循环结构,并提供多个实用示例帮助初学者快速掌握这些概念。所有代码都使用基础语法,非常适合Python新手学习。 1. 简单条件判断: 编写一个程序,要求用户输入一个…...
Unity PBR基础知识
PBR原理 基于物理的渲染(Physically Based Rendering,PBR)是指使用基于物理原理和微平面理论建模的着色/光照模型,以及使用从现实中测量的表面参数来准确表示真实世界材质的渲染理念。 PBR基础理念 微平面理论(Micr…...
智慧交警系统架构设计方案
一、引言:智慧交警为何成为城市治理的刚需? 当前,中国城市化进程加速,汽车保有量激增,交通拥堵、事故频发、执法效率不足等问题日益突出。传统交通管理依赖人力巡查与分散系统,已难以应对复杂需求。智慧交…...
NOC科普一
拓扑结构 NoC里Router之间的link链路连接可以定义成不同的结构以改变通信测量和简化片上通信结构。 (a)Ring:环形,每个router都有2个相邻节点,虽然部署和故障排除相对容易,但主要缺点是其通信的距离也即环…...
Linux CentOS 7 安装Apache 部署html页面
*、使用yum包管理器安装Apache。运行以下命令: sudo yum install httpd *、启动Apache服务 sudo systemctl start httpd *、设置Apache服务开机自启 sudo systemctl enable httpd *、验证Apache是否运行 sudo systemctl status httpd 或者,通过浏…...
人工智能在医疗行业的应用和发展前景
人工智能在医疗行业的应用和发展前景 引言 在科技日新月异的今天,人工智能(Artificial Intelligence,AI)已然成为全球最具潜力与影响力的技术之一。医疗行业,作为关乎人类健康与生命的关键领域,正迅速成为人工智能应用的热门阵地。人工智能在医疗领域的应用,不仅为解决…...
vue3+Nest.js项目 部署阿里云
可以先参考之前的vue3express部署的文章 vue3viteexpressmongoDB上线(新手向)_vue3 vite express-CSDN博客 区别在于express和数据库 前端前往上面文章查看 1.nest.js部署 首先,把nest.js中相关的文件打包 除去依赖(node_modules)上传到服…...
phpstudy修改Apache端口号
1. 修改Listen.conf文件 本地phpstudy安装目录: 2.其他问题 ① 修改httpd.conf不起作用 ② 直接通过控制面板配置好像有延迟缓存...
JSON-RPC 2.0 规范中文版——无状态轻量级远程过程调用协议
前言 JSON-RPC是一种简单、轻量且无状态的远程过程调用(RPC)协议,它允许不同系统通过标准化的数据格式进行通信。自2010年由JSON-RPC工作组发布以来,已成为众多应用中实现远程交互的基础协议之一。本规范主要表达了JSON-RPC 2.0版…...
DeepSeek+Dify之七借助API和Trae完成demo
DeepSeek+Dify之六通过API调用工作流 文章目录 背景准备资料1、借助Trae来创建demo2、前后端主要代码3、测试demo4、完整项目背景 在软件开发与项目实践领域,常常需要借助各种工具与技术来快速搭建可运行的示例项目,以验证思路、展示功能或进行技术探索。本文聚焦于借助 Tra…...
C++ 红黑树
上一节我介绍了二叉搜索树家族的AVL树,这里我们来介绍二叉搜索树家族的另一个成员,也是使用最广泛的成员。 1.AVL树与红黑树的区别 平衡性质 AVL 树:是严格的平衡二叉树,要求任意节点的左右子树高度差的绝对值不超过 1ÿ…...
学习海康VisionMaster之线圆测量
一:进一步学习了 今天学习下VisionMaster中的线圆测量:核心就是坐标点到直线的距离量测 1:什么是线圆测量? 工业自动化中很常见的应用尺寸测量,需要量测一个零件的外形尺寸,其中一项如果是需要测量圆心到直…...
Uniapp:置顶
目录 一、出现场景二、效果展示三、具体使用一、出现场景 在项目的开发过程中,我们经常会用到置顶的功能,比如说从页面的最下方滑动到最上面太慢了,这个时候我们就可以使用置顶功能。 二、效果展示 三、具体使用 参数名类型必填说明scrollTopNumber否滚动到页面的目标位置…...
UDP数据报和TCP流套接字编程
文章目录 UDP数据报套接字编程1.DatagramSocket类2.DatagramPacket类3. InetSocketAddress类构建服务端和客户端 TCP流套接字编程1. ServerSocket类2.Socket类构建服务端和客户端 扩展对话形式简易的字典多线程实现线程池实现 UDP数据报套接字编程 1.DatagramSocket类 Datagr…...
某建筑石料用灰岩矿自动化监测
1. 项目简介 某建材有限公司成立于2012年,是一家集矿山开采、石料生产及销售为一体的建筑材料生产企业,拥有两条年产500万吨的环保型精品骨料生产线,各类工程机械 30 多台套,运输车辆50多辆。公司坚持生态优先,以高质…...
C++11 的编译器支持
C11 主要功能特性一览 特性描述提案GCCClangMSVCApple ClangEDG eccpIntel CNvidia HPC C (ex PGI)*Nvidia nvccCrayEmbarcadero C BuilderIBM Open XL C for AIXIBM Open XL C for z/OSIBM XL CSun/Oracle CHP aCCDigital Mars C核心功能右值引用 (T&&)支持移动语义和…...
20250429 垂直地表发射激光测量偏转可以验证相对性原理吗
垂直地表发射激光测量偏转可以验证相对性原理吗 垂直地表发射激光测量偏转可以在一定条件下用于检验广义相对论中的等效原理和引力对光传播的影响,但要说直接验证整个相对性原理(狭义广义)是不准确的。我们可以逐步分析这个问题:…...
Makefile 在 ARM MCU 开发中的编译与链接参数详解与实践
内容大纲 引言 一、预处理与宏定义 头文件搜索路径:-I 宏定义:-D 二、编译器选项(CFLAGS) 架构与指令集:-mcpu、-mthumb 优化与调试:-Os、-O2、-g 警告与错误:-Wall、-Werror 代码剥离:-ffunction-sections、-fdata-sections 其他常用选项 三、链接器选项(LDFLAGS) 链…...
AimRT 从零到一:官方示例精讲 —— 四、logger示例.md
logger示例 官方仓库:logger 配置文件(configuration_logger.yaml) 依据官方示例项目结构自行编写YAML配置文件: # 基础信息 base_info:project_name: Logger # 项目名称build_mode_tags: ["EXAMPLE", "SIMULATION", "TE…...
mybatis传递多个不同类型的参数到mapper xml文件
在业务中查询某张表时需要设置多个查询条件,并且还要根据id列表进行权限过滤,这时推荐采用Map<String, Object>作为参数进行查询,因为:Object可以设置成不同的类型,比如:List<Integer> ids&…...
信创开发中的数据库详解:国产替代背景下的技术生态与实践指南
🧑 博主简介:CSDN博客专家、CSDN平台优质创作者,高级开发工程师,数学专业,10年以上C/C, C#, Java等多种编程语言开发经验,拥有高级工程师证书;擅长C/C、C#等开发语言,熟悉Java常用开…...
【Linux】第十三章 访问Linux文件系统
目录 1. 存储设备是什么?怎么理解分区和格式化? 2. 文件系统是什么? 3. 挂载是什么?挂载点是什么? 4. 怎么理解块设备? 5. 在SATA附加存储中,第一磁盘上的第一个分区和第二磁盘的第二个分区…...
多态与虚函数
在 C 中,virtual 关键字用于实现多态性(Polymorphism),这是面向对象编程(OOPP)的核心特性之一。多态性允许你编写通用的代码,该代码可以操作不同类型的对象,而这些对象可以有不同的内…...
Spring Boot - 配置管理与自动化配置进阶
Spring Boot 的配置管理和自动化配置是其核心特性之一,能够显著提升开发效率和应用灵活性。本文将深入探讨以下内容: 1、配置管理:多环境配置与优先级解析。 2、自动化配置:自定义 Spring Boot Starter 与 spring.factories 扩展…...
第六章 QT基础:7、Qt中多线程的使用
在进行桌面应用程序开发时,假设应用程序需要处理比较复杂的逻辑,如果只有一个线程去处理,就会导致窗口卡顿,无法处理用户的相关操作。 这种情况下,需要使用多线程: 主线程处理窗口事件和控件更新子线程进…...
前端Vue3 + 后端Spring Boot,前端取消请求后端处理逻辑分析
在 Vue3 Spring Boot 的技术栈下,前端取消请求后,后端是否继续执行业务逻辑的答案仍然是 取决于请求处理的阶段 和 Spring Boot 的实现方式。以下是结合具体技术的详细分析: 1. 请求未到达 Spring Boot 场景:前端通过 AbortContr…...
ShaderToy学习笔记 05.3D旋转
1. 3D旋转 1.1. 汇制立方体 由于立方体没有旋转,所以正对着看过去时,看起来是正方形的,所以需要旋转一下,才能看到立方体的样子。 常见几何体的SDF BOX 的SDF为 float sdBox( vec3 p, vec3 b ) {vec3 q abs(p) - b;return len…...
编程日志4.24
栈的链表基础表示结构 #include<iostream> #include<stdexcept> using namespace std; //模板声明,表明Stack类是一个通用的模板,可以用于存储任何类型的元素T template<typename T> //栈的声明 //Stack类的声明,表示一…...
通信设备制造数字化转型中的创新模式与实践探索
在数字化浪潮下,通信设备制造企业积极探索创新模式,推动数字化转型,以提升竞争力和适应市场变化。 在生产模式创新方面,企业引入工业互联网平台,实现设备互联互通与生产过程智能化监控。通过在生产设备上安装传感器&a…...
同一个路由器接口eth0和ppp0什么不同?
答案摘自 百度知道, eth0是以太网接口,是表示以太网连接的物理接口,路由器可能会有不止一个以太网接口,因此可能会eth0,eht1之类的。 ppp0是经以太网接口PPP拨号时创建的链路接口,用以建PPP拨号连接的&am…...
零训练成本优化LLM: 11种LLM权重合并策略原理与MergeKit实战配置
随着大语言模型的快速发展,如何在不消耗大量计算资源的情况下优化模型性能成为业界关注焦点。模型权重合并技术提供了一种零训练成本的高效解决方案,能够智能整合多个专业微调模型的优势,无需额外训练即可显著提升性能表现。本文系统剖析11种…...
基于tabula对pdf中多个excel进行识别并转换成word中的优化(五)
优化地方:处理合并的单元格内容。 1、修改为stream"complex" 2、增加换行符f"{table_data[i - 1][j]}\n{table_data[i][j]}".strip() 一、pdf中excel样例 二、完整代码 import tabula import numpy as np from docx import Document from docx…...
QT中的网络编程
Qt中的网络编程是通过封装操作系统的API进行实现的 C标准库中,并没有提供网络编程的封装接口 进行网络编程时本质是在编写应用层代码,需要传输层提供支持 传输层最核心的协议为UDP/TCP 使用Qt网络编程的API时,需要在.pro文件中添加network模块…...
0.5 像素边框实现
0.5 像素边框怎么实现 文章目录 0.5 像素边框怎么实现方法 1:使用 transform: scale() 缩放(推荐)方法 2:直接使用 0.5px 边框(部分浏览器支持)方法 3:使用 box-shadow 模拟边框方法 4ÿ…...
【Vagrant+VirtualBox创建自动化虚拟环境】Ansible测试Playbook
文章目录 Vagrant安装vagrant安装 VirtualBox如何使用 Ansible安装AnsiblePlaybook测试创建hosts文件创建setup.yml文件 Vagrant Vagrant是一个基于Ruby的工具,用于创建和部署虚拟化开发环境。它使用Oracle的开源VirtualBox虚拟化系统,使用 Chef创建自动…...
“连接世界的桥梁:深入理解计算机网络应用层”
一、引言 当你浏览网页、发送邮件、聊天或观看视频时,这一切都离不开计算机网络中的应用层(Application Layer)。 应用层是网络协议栈的最顶层,直接为用户的各种应用程序提供服务。它为用户进程之间建立通信桥梁,屏蔽了…...
Vulkan与OpenGL的对比
传统图形API与现代图形API 传统图形API指的是OpenGL/DirectX11这类简单易用、驱动托管严重的图形接口;而现代图形API则指的是Vulkan/Metal/DirectX12这类使用复杂、暴露更多底层硬件功能来显式控制的弱驱动设计的图形接口。 现代图形API与传统图形API相比ÿ…...
海外社交App的Web3革命:去中心化社交与Token经济实战指南
一、Web3社交的核心组件:从身份到经济的重构 去中心化身份(DID)技术栈:Ceramic IDX协议构建链上身份图谱代码示例:javascript// 创建DID const ceramic new CeramicClient() const did new DID({ provider: cerami…...