当前位置: 首页 > news >正文

使用SparkGraphX进行图计算时的编码问题

使用SparkGraphX进行图计算时的编码问题

在SparkGraphX体系中,要求图网络中的点ID必须为Long类型,不像Python中的networkX工具包支持字符串类型的节点表示,但在现实场景中,有很多情况下,点ID都是字符串类型的,如身份证号、设备号或是埋点采集到的uid等等,都不是单纯能够使用Long类型来表示的。
为解决上述问题,本文将提出两种解决方案,分别是Hash编码以及Row_number编码,接下来本文将详细描述上述两种方案的优缺点以及实现代码(基于Scala实现)。

文章目录

  • 使用SparkGraphX进行图计算时的编码问题
  • 一、Hash编码
  • 一、pandas是什么?
  • 二、Row_number编码
  • 总结


一、Hash编码

与Python自带的Hash编码不同,Java中的hash编码,多次执行,对同一变量得到的Hash编码相同,Python中带有随机因子,多次执行结果不一样。
但Java自带的Hash编码由于使用了截断(得到的编码是Int类型,取值范围相对较小),在大数据量容易出现Hash碰撞问题,但在数据量较小的时候,还是非常好用的并且实现非常简单。
Hash编码

一、pandas是什么?

示例:pandas 是基于NumPy 的一种工具,该工具是为了解决数据分析任务而创建的。

二、Row_number编码

另一种编码方案即为借助SQL中的开窗函数row_number的功能,对所有的点ID都生成一个递增的编码,保留原ID与编码之间的对应关系(一个DataFrame),使用编码ID进行后续的图计算,计算完成后再将编码结果转换回原ID结果。
相比Hash编码,这种编码方案的优点很明显,完全不用担心碰撞问题,能够精准保证原ID与编码ID一一对应,但缺点也很明显,计算效率会降低,尤其在大数据量下执行row_number操作,虽然Spark内部对这类函数做了优化,但是效率仍然是一个大问题,依靠提高并发以及分配更多的资源能一定程度上提高运行效率,但与Hash编码依然是没法比,还是要做权衡,如果数据量不大,对精度要求不高,一般优先使用Hash编码;如果数据量较大或是对精度要求比较高的场景,则优先考虑row_number实现方案。

Row_number编码 实现代码


总结

在这里插入图片描述


http://www.mrgr.cn/news/12208.html

相关文章:

  • 如何完美实现 Go 服务的平滑升级
  • 8. 为什么 Java 中 HashMap 的默认负载因子是 0.75?
  • Unity 离线文档快速访问处理文件
  • 高效能低延迟:EasyCVR平台WebRTC支持H.265在远程监控中的优势
  • Java-List分批多线程执行
  • ModBus RTU、ModBus ASCII、ModBus TCP,它们有什么区别?
  • 算法训练营|图论第二天 99.岛屿数量 100.岛屿的最大面积
  • 【北森-注册安全分析报告-无验证方式导致安全隐患】
  • 列式存储数据库(Columnar Database)
  • 趣味算法------试用 6 和 9 组成的最大数字
  • streamlit+wordcloud使用pyinstaller打包遇到的一些坑
  • SpringBootWeb入门-HTTP协议、Tomcat下载、基本使用、入门程序解析
  • 每天一个数据分析题(四百九十九)- 数据集
  • EmguCV学习笔记 VB.Net 6.S 特别示例
  • # 移动硬盘误操作制作为启动盘数据恢复问题
  • JVM知识点记录
  • jQuery 事件
  • 【UE5】库存系统——01
  • MySQL集群技术4——MySQL路由
  • 什么是令牌桶算法?工作原理是什么?使用它有哪些优点和注意事项?