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

    你可能感兴趣的文章
    Oracle中Transate函数的使用
    查看>>
    oracle中关于日期问题的汇总!
    查看>>
    Oracle中常用的语句
    查看>>
    Oracle中序列的操作以及使用前对序列的初始化
    查看>>
    oracle中新建用户和赋予权限
    查看>>
    Oracle中的NVL,NVL2,NULLIF以及COALESCE函数使用
    查看>>
    Oracle中的rownum 和rowid的用法和区别
    查看>>
    oracle中的大小写、字符、dual、数字、处理、日期、函数、显/隐式、时间、条件表达式case、decode、to_date、to_char、sysdate
    查看>>
    oracle中表和视图的区别,oracle中常用表和视图
    查看>>
    oracle之表空间(tablespace)、方案(schema)、段(segment)、区(extent)、块(block)
    查看>>
    Oracle从11g导出后导入10g
    查看>>
    oracle从备份归档日志的方法集中回收
    查看>>
    oracle优化器analyzed,Oracle 学习之 性能优化(十三) 索引
    查看>>
    Oracle修改字段类型
    查看>>
    Oracle修改表或者字段的注释
    查看>>
    oracle典型安装失败,安装oracle 10失败
    查看>>
    Oracle内存结构详解(四)--Oracle SGA其他组成部分
    查看>>
    Oracle函数与存储过程和程序包
    查看>>
    Oracle分析函数之LEAD和LAG
    查看>>
    Oracle分组取前n条记录
    查看>>