Spark中做两个大hive表的join操作,先读取过来处理成两个数据量很大的RDD,如果两个RDD直接进行join操作,势必会造成shuffle等导致运行非常缓慢,那么怎么优化呢?方法如下:

首先,对每个大hive表生成RDD进行优化

1. 对RDD进行repartition重分区

先依据Executor数和内存情况估算出对RDD分为多少个partition比较合适,因为一个partition对应一个task,会分发给一个Executor的core去执行运算操作。

所以首先对RDD进行重分区,将数据打散。

2. 采用mapPartition算子,一次性处理一个分区的数据

在这一步进行group by操作,将相同key的value值进行加和

3. reduceByKey算子,对不同的key进行聚合

经过上面的重分区,以及预聚合(group by,func加和),此时reduce端的计算压力就小了很多。

然后,对两个hive表对应的<经步骤一处理后的RDD>,进行重分区操作

这一步是因为如果两个RDD的分区数一致,join的时候就不会出现一个分区的key需要关联另一边多个分区的key的情况,也就是不会出现宽依赖,即不会出现shuffle操作;

这样也可以加快join的速度。

最后,两个RDD进行join即可。

-----------------------以下为mapPartition算子的使用技巧---------------------

因为mapPartition算子里func的函数类型:Iterator[T] => Iterator[U],也就是需要返回一个迭代器类型

所以代码如下,需要加容器

//先分组,解决数据倾斜问题,
val vertexPairRddGroup1: RDD[(String, String)] = vertexPairRdd.map {case ((srcId, dstId), (_, _)) => (srcId, dstId)
}.mapPartitions(iter => {//对每个分区进行分组,groupbyKeyval list = iter.toListval data = list.groupBy(x => x._1)//分组后的容器val buffer = new ListBuffer[(String, String)]data.foreach(x => {var str = ""x._2.foreach(y => {str = str + "\001" + y._2})if (!"".equals(str)) {val ids = str.trimbuffer.+=((x._1, ids))}})buffer.toIterator
}).reduceByKey((V1, V2) => V1 + "\001" + V2, 5000)

by 大牛王伟大牛

spark做两张大表的join操作,mapPartition和重分区算子的使用策略相关推荐

  1. shell中join链接多个域_shell 如何实现两个表的join操作

    shell 如何实现两个表的join操作 今天研究的一个问题是:在Shell 脚本中如何实现两个表的 join 操作,这里说的两个表示的其实是 两个文件,但是文件是列表的形式,有固定的分割符号,即就相 ...

  2. spark中repartition, coalesce, partitionBy, repartitionAndSortWithinPartitions 四种重分区算子

    美图欣赏: 一.背景 spark中一共有四种重分区算子: 1.repartition 2.coalesce 3.partitionBy 4.repartitionAndSortWithinPartit ...

  3. mysql两张大表join优化,MySQL系列6 - join语句的优化

    当被驱动表是一张非常大的冷表,且没有命中索引时.我们该如何做优化呢? 表t2的c2字段是没有索引的,且t2表是一张超级大的冷表,join语句如下: select * from t1 straight_ ...

  4. mysql 两张大表关联_MySQL的DropTable影响分析和最佳实践

    [0.前言] MySQL上直接Drop张大表,会有什么影响,能否直接写个 drop table ; 或者 truncate table ; 甚至是delete * from? 如果这张表足够大,比如1 ...

  5. mysql 两张大表关联_详解mysql生产环境如何快速有效的删除大表,附实验说明

    概述 我们很多时候都会去drop一些大表,特别是生产环境做操作时,这里主要提一些注意事项,仅供参考. 01 相关语法 1.删表 DROP TABLE SyntaxDROP [TEMPORARY] TA ...

  6. Hive 两张表数据验证方案、两张大表如何进行数据验证以及剔除部分字段进行数据验证

    最近的问题是,宽表在上线之前,需要在测试环境进行试跑,试跑结束后如何跟线上正式数据进行比对呢?简单记录一下设计方案. 1.小表数据验证 一些字段比较少的表进行数据验证的方案之前出过 Hive 数据模型 ...

  7. datatable对两个csv的join操作

    代码根据key=TransactionID来进行join操作 go.py import datatable as dtfolder_path = './' train_identity = dt.fr ...

  8. 如何使用纯Servlet做一个单表的CRUD操作

    目录 第一步:准备一张数据库表.(sql脚本) 第二步:准备一套HTML页面(项目原型)[前端开发工具使用HBuilder] 第三步:分析我们这个系统包括哪些功能? 第四步:在IDEA当中搭建开发环境 ...

  9. php mysql两个表合并_php操作mysql两个数据库中表的数据同步

    题记: 我们开发当中经常会遇到,数据同步.比如将teaching数据库中area表的数据同步到study数据库中zone表中. 备注:这两个数据库不同,数据表名字也不同,但数据表的结构相同.不同表结构 ...

最新文章

  1. 谷歌新深度学习系统可以促进放射科医生的发展
  2. mysql 导入mongodb_mysql数据库迁移导入到mongodb详细教程
  3. Solr学习笔记——查询
  4. CCCC/PTA 2019模拟赛 L3-3 至多删三个字符
  5. 开始VC6学习之旅2
  6. 西宾喜马拉雅语音下载工具(ximalayadown)
  7. Irc 客户端 Android,Revolution IRC | F-Droid - Free and Open Source Android App Repository
  8. 中国将在未来几十年主导电动汽车市场
  9. 可以真正带你理清同步阻塞与同步非阻塞与异步阻塞与异步非阻塞的文章
  10. cesium解决DeveloperError报错‘Expected longitude to be typeof number, actual type of was string‘
  11. PySpark ERROR: Python in worker has different version 3.9 than that in driver 3.8
  12. 【毕业设计】基于PID控制的智能平衡车 - stm32 物联网 单片机 超详细
  13. vivado 配置matlab,Matlab vivado
  14. 痛惜!34岁研究生猝死!事发当天熬夜到凌晨两点半,生前称被延毕半年…
  15. 【Vue】学习笔记-Vuex
  16. NC、NC57、NC65、NCC、U8C移动审批
  17. 软件包管理,rpm,yum,dnf,apt,dpkg使用
  18. 南油 机器人_机器人创客-作文
  19. 如何掌握所有的程序语言
  20. 基于JAVA的学习平台-课程教学网站

热门文章

  1. couldn‘t upgrade db schema: insert into ACT_GE_PROPERTY values (‘common.sche[已解决]
  2. 学校计算机使用维护管理制度,计算机教室使用管理制度
  3. 比较两数大小c语言,C语言比较两个数字的大小
  4. P1423 小玉在游泳-C语言
  5. 维修手记——燃气热水器低水压点火困…
  6. Firefox 账号信息同步/登录问题
  7. 计算机推测四维空间,4维空间真的存在吗?科学家推测未来人类可能会生活在4维空间中...
  8. English语法_名词性从句
  9. uni-app 上架应用商店踩坑过程
  10. php Carbon 中文文档