博客
关于我
【Spark】Spark 优化操作之自定义 distinct
阅读量:372 次
发布时间:2019-03-05

本文共 801 字,大约阅读时间需要 2 分钟。

由于Spark的distinct算子默认实现效率较低,需要自行优化以提升性能。

具体实现方式非常简单,主要基于集合的特性。

def mydistinct(iter: Iterator[(String, Int)]: Iterator[String] = {     iter.foldLeft(Set[String]())((curS, item) => curS + item._1).toIterator}

使用mydistinct的方式如下:

val rdd2 = rdd1.map(x => (x._1 + SPLIT + x._2 + SPLIT + x._3 + SPLIT + x._4, 1)).partitionBy(new org.apache.spark.HashPartitioner(100)).mapPartitions(SetProcess.mydistinct).map(key => {       val strs = key.split(SPLIT)       (strs(0), strs(1), strs(2), strs(3))

说明:

  • mydistinct通过Set的特性实现去重,在每个partition内完成后再进行reduce,这样可以显著提升去重效率。
  • 在进行mydistinct之前,需要先对数据进行partitionBy操作。因为数据的key值发生了变化,原有的RDD分区可能不适用于新的RDD。如果不做partitionBy,可能会导致不同的partition之间存在重复数据,从而影响最终的去重效果。
  • 通过partitionBy操作,可以将相同key值的数据刷新到同一个partition中。在每个partition内使用Set去重,大大提高了整体性能。
  • 这种方法充分利用了Spark的高效分区机制和集合的去重特性,实现了高效的去重操作。

    转载地址:http://xdig.baihongyu.com/

    你可能感兴趣的文章
    openlayers 入门教程(十四):第三方插件
    查看>>
    openlayers 入门教程(四):layers 篇
    查看>>
    Openlayers中使用Cluster实现点位元素重合时动态聚合与取消聚合
    查看>>
    Openlayers中使用Cluster实现缩放地图时图层聚合与取消聚合
    查看>>
    Openlayers中使用Image的rotation实现车辆定位导航带转角(判断车辆图片旋转角度)
    查看>>
    Openlayers中点击地图获取坐标并输出
    查看>>
    Openlayers中设置定时绘制和清理直线图层
    查看>>
    Openlayers图文版实战,vue项目从0到1做基础配置
    查看>>
    Openlayers实战:modifystart、modifyend互动示例
    查看>>
    Openlayers实战:判断共享单车是否在电子围栏内
    查看>>
    Openlayers实战:绘制图形,导出geojson文件
    查看>>
    Openlayers实战:绘制图形,导出KML文件
    查看>>
    Openlayers实战:绘制多边形,导出CSV文件
    查看>>
    Openlayers实战:输入WKT数据,输出GML、Polyline、GeoJSON格式数据
    查看>>
    Openlayers高级交互(10/20):绘制矩形,截取对应部分的地图并保存
    查看>>
    Openlayers高级交互(11/20):显示带箭头的线段轨迹,箭头居中
    查看>>
    Openlayers高级交互(14/20):汽车移动轨迹动画(开始、暂停、结束)
    查看>>
    Openlayers高级交互(15/20):显示海量多边形,10ms加载完成
    查看>>
    Openlayers高级交互(16/20):两个多边形的交集、差集、并集处理
    查看>>
    Openlayers高级交互(17/20):通过坐标显示多边形,计算出最大幅宽
    查看>>