博客
关于我
【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/

    你可能感兴趣的文章
    OSChina 周日乱弹 —— 2014 年各种奇葩评论集合
    查看>>
    OSChina 技术周刊第十期,每周技术抢先看!
    查看>>
    oscp--python
    查看>>
    OSError: no library called “cairo-2“ was foundno library called “cairo“ was foundno library called
    查看>>
    OSError: [WinError 193] %1 不是有效的 Win32 应用程序。
    查看>>
    osgearth介绍
    查看>>
    OSGi与Maven、Eclipse PlugIn的区别
    查看>>
    Osgi环境配置
    查看>>
    OSG——选取和拖拽
    查看>>
    OSG中找到特定节点的方法(转)
    查看>>
    OSG学习:C#调用非托管C++方法——C++/CLI
    查看>>
    OSG学习:OSG中的智能指针
    查看>>
    OSG学习:OSG组成(一)——组成模块
    查看>>
    OSG学习:OSG组成(三)——组成模块(续):OSG核心库中的一些类和方法
    查看>>
    OSG学习:OSG组成(二)——场景树
    查看>>
    OSG学习:OSG组成(二)——渲染状态和纹理映射
    查看>>
    OSG学习:WIN10系统下OSG+VS2017编译及运行
    查看>>
    OSG学习:人机交互——普通键盘事件:着火的飞机
    查看>>
    OSG学习:几何体的操作(一)——交互事件、简化几何体
    查看>>
    OSG学习:几何体的操作(二)——交互事件、Delaunay三角网绘制
    查看>>