Spark的dropDuplicates或distinct 对数据去重

大数据Spark面试,distinct去重原理,是如何实现的 最近,有位朋友问我,distinct去重原理是怎么实现的? “在面试时,面试官问他了解distinct算子吗?” “了解啊,Spark的rdd,一种transFormation去重的算子,主要用来去重的”。 “哟,看来你经常使用distinct算子,对distinct算子很熟悉啊”。 “好说,好说”。 “那你能说说distinct是如何实现去重的吗?” 我朋友支支吾吾半天:“就是这样、那样去重的啊”。 “这样、那样是怎么去重的呢” “具体有点忘记了(其实是根本就不知道)”。 那么disti 阅读详情

消除重复的数据可以通过使用 distinct 和 dropDuplicates 两个方法。

distinct数据去重

distinct 是所有的列进行去重的操作,假如你的 DataFrame里面有10列,那么只有这10列完全相同才会去重。
使用distinct:返回当前DataFrame中不重复的Row记录。该方法和接下来的dropDuplicates()方法不传入指定字段时的结果相同。

dropDuplicates()y有四个重载方法

  1. 第一个def dropDuplicates(): Dataset[T] = dropDuplicates(this.columns)
    这个方法,不需要传入任何的参数,默认根据所有列进行去重,然后按数据行的顺序保留每行数据出现的第一条。
 def dropDuplicates(colNames: Array[String]): Dataset[T] = dropDuplicates(colNames.toSeq)
  1. 第二个def dropDuplicates(colNames: Seq[String])
    传入的参数是一个序列。你可以在序列中指定你要根据哪些列的重复元素对数据表进行去重,然后也是返回每一行数据出现的第一条
def dropDuplicates(colNames: Seq[String]): Dataset[T] = withTypedPlan {
    val resolver = sparkSession.sessionState.analyzer.resolver
    val allColumns = queryExecution.analyzed.output
    val groupCols = colNames.toSet.toSeq.flatMap { (colName: String) =>
      // It is possibly there are more than one columns with the same name,
      // so we call filter instead of find.
      val cols = allColumns.filter(col => resolver(col.name, colName))
      if (cols.isEmpty) {
        throw new AnalysisException(
          s"""Cannot resolve column name "$colName" among (${schema.fieldNames.mkString(", ")})""")
      }
      cols
    }
    Deduplicate(groupCols, planWithBarrier)
  }
  1. 第三个def dropDuplicates(colNames: Array[String])
    传入的参数是一个数组,然后方法会把数组转换为序列然后再调用第二个方法。
def dropDuplicates(colNames: Array[String]): Dataset[T] = dropDuplicates(colNames.toSeq)
  1. 第四个def dropDuplicates(col1: String, cols: String*)
    传入的参数为字符串,在方法体内会把你传入的字符串组合成一个序列再调用第二个方法。
  @scala.annotation.varargs
  def dropDuplicates(col1: String, cols: String*): Dataset[T] = {
    val colNames: Seq[String] = col1 +: cols
    dropDuplicates(colNames)
  }

第三和第四个本质上还是调用了第二个方法,所以我们在使用的时候如果需要根据指定的列进行数据去重,可以直接传入一个Seq。

第一个方法默认根据所有列去重,实际上也是调用了第二个方法,然后传入参数this.columns,即所有的列组成的Seq。

所以各位想深究dropDuplicate()去重的核心代码,只需要研究第二个去重方法即可。

特别的

使用dropDuplicate时,可以先排序,去重时,会保留排第一的,如:

val sourceByTime = df.select("url", "name","updatetime").repartition(col("url"))//这一步是为了解决下面注意事项里出现的问题
            .orderBy(desc("updatetime")).dropDuplicates(Seq("url")) 

上面代码,会保留每个url最新的数据。

注意事项

用dropDuplicates可能会出现重复数据,原因:

数据存在多个excuter中,因为spark是分布式计算的,数据在计算的时候会分布在不同的excutor上,使用dropDuplicate去重的时候,可能只是一个excutor内的数据进行了去重,别的excutor上可能还会有重复的数据。

数据是存放在不同分区的,因为spark是分布式计算的,数据在计算的时候会分散在不同的分区中,使用dropDuplicate去重的时候,不同的区分可能还会存在相同的数据。

参考

https://www.cnblogs.com/Jaryer/p/13558701.html
https://blog.youkuaiyun.com/qq_39900031/article/details/115797287
https://www.yangch.net/archives/114

Spark 算子之distinct使用 阅读详情

相关推荐

Spark distinct去重原理 (distinct会导致shuffle)

distinct算子原理:含有reduceByKey则会有shuffle 贴上spark源码: /** * Return a new RDD containing the distinct elements in this RDD. */ def distinct(numPartitions: Int)(implicit ord: Ordering[T] = null): RDD[T] = withScope { map(x => (x, null)).redu.

Top5软件工程硕士,先后在京东、字节从事多年Java后端开发、实时和离线大数据开发 3147

Spark Sql之dropDuplicates去重

Spark Sql之dropDuplicates去重

南风知我意 2511

超级详细!!!新手使用AutoDL跑深度学习(MixVPR项目)的学习记录

新手第一次在AutoDL上跑深度学习的实验,遇到一些问题,简单记录一下。如果大家发现问题,欢迎和我讨论。

weixin_45152283的博客 5万+

drop_duplicates去重详解

根据数据的不同情况及处理数据的不同需求,通常会分为两种情况,一种是去除完全重复的行数据,另一种是去除某几列重复的行数据,就这两种情况可用下面的代码进行处理。 1. 去除完全重复的行数据 data.drop_duplicates(inplace=True) 2. 去除某几列重复的行数据 data.drop_duplicates(subset=['A','B'],keep='first',inpla...

dzysunshine的博客 11万+

重磅!AI实时读取总结微信聊天记录,附MCP协议+智能体配置教程!

【摘要】本文介绍了一套AI实时分析微信聊天记录的解决方案,通过Chatlog+Trae+MCP协议实现智能整理群聊信息。Chatlog作为开源工具本地解析微信数据,确保隐私安全;Trae提供AI分析能力,支持自然语言处理。操作步骤包括:1)下载运行Chatlog并启动HTTP服务;2)安装Trae配置MCP协议;3)创建智能体设置提示词。该方案虽需初始配置,但能有效解决群聊信息过载问题,自动提炼关键内容,避免有价值信息被淹没。文中提供了详细教程链接和网盘资源。

puyihuan的博客 1万+

Pico设备手势追踪实战:5步搞定MRTK3手部模型与UI交互配置

本文详细介绍了在Pico设备上使用MRTK3实现手势追踪的5个关键步骤,包括环境配置、手部模型冲突解决、射线交互优化、UI交互配置及性能优化。通过实战案例和代码示例,帮助开发者快速解决MR开发中的常见问题,提升混合现实应用的交互体验。

onion的博客 498

spark sql 去重 distinct dropDuplicates

spark sql distinct dropDuplicates

m0_54603030的博客 2814

搞定汽车座椅电机EMC超标:一个PCB滤波板的实战设计与避坑心得

本文详细介绍了汽车座椅电机EMC超标问题的解决方案,通过PCB滤波板的实战设计,解决了传导发射测试超标问题。文章分享了在空间受限条件下的滤波电路架构设计、接地系统优化及迭代验证过程,为汽车直流电机的EMC整改提供了实用方法论。

weixin_30336061的博客 379

spark5种去重方式,快速去重

双重group by将去重分成了两步,是分组聚合运算,group by操作能进行多个reduce任务并行处理,每个reduce都能收到一部分数据然后进行分组内去重,不再像distinct只有一个reduce进行全局去重.sql中最简单的方式,当数据量小的时候性能还好.当数据量大的时候性能较差.因为distinct全局只有一个reduce任务来做去重操作,极容易发生数据倾斜的情况,整体运行效率较慢.DataFrame中,可以先将分区内数据进行排序,然后通过dropDuplicates将重复的数据删除.

qq_39285950的博客 8611

120、ISP 驱动架构解析:从 V4L2 请求到 ISP 硬件的配置下发流程

本文以实际案例解析ISP驱动架构的V4L2到硬件配置下发流程。作者通过一个因内存共享导致画面闪烁的bug案例,详细剖析了用户空间参数通过V4L2结构体传递、驱动层拆包与硬件寄存器映射、时序同步机制等关键环节。特别强调深拷贝、dirty flag增量更新、shadow register等实现要点,并给出多路并发隔离、寄存器写入失败等典型问题的排查方法。文章建议开发者深入理解参数到寄存器的转换过程,推荐通过debugfs实时监控寄存器状态,避免过度依赖自动调试工具。全文以实践为导向,对ISP驱动开发具有直接指导

sundong_81的博客 159

【AUTOSAR-IpduM】-3.1-配置一个发送Tx Dynamic Container PDU(Multiple-PDU)

手把手教您如何配置一个Tx Dynamic Container PDU(Multiple-PDU),动态容器复用帧。并附上测试LOG帮助您进一步加深理解。

「汽车电子助手」的博客 1770

190、Spark 2.0之Dataset开发详解-typed操作:distinct、dropDuplicates

distinct和dropDuplicates,都是用来进行去重的 区别在于,distinct,是根据每一条数据,进行完整内容的比对和去重 dropDuplicates,可以根据指定的字段进行去重 代码 object TypedOperation { case class Employee(name: String, age: Long, depId: Long, gender: St...

ZJ__ZFH的博客 1758

【ARM CoreLink 系列 3 -- CCI-550 控制器介绍 】

Arm CoreLink CCI-550 Cache Coherent Interconnect 扩展了 CoreLink CCI-500。它在 big.LITTLE 处理器集群之间提供完整的缓存一致性,并为其他代理(如 Mali GPU、网络接口或加速器)提供 I/O 一致性。CoreLink CCI-550 提供可扩展和可配置的互连,使 SoC 设计人员能够以尽可能小的面积和功耗满足性能目标,并且还增加了可降低整体系统延迟的监听滤波器。

CodingCos的博客 2210

pyspark:distinct和dropDuplicates区别

distinct数据去重 使用distinct:返回当前DataFrame中不重复的Row记录。该方法和接下来的dropDuplicates()方法不传入指定字段时的结果相同。 dropDuplicates:根据指定字段去重 跟distinct方法不同的是,此方法可以根据指定字段去重。 例如我们想要去掉相同用户通过相同渠道下单的数据: df.dropDuplicates("user","type").show() 输出: +---+----+----+--------------------+ | id

学习 记录 总结 分享 4861

2026年数字IC设计华为笔试带答案解析

这篇文章是一份数字IC设计工程师笔试的试卷结构和部分题目解析。试卷包含单选题31题(每题2分)、多选题10题(每题4分)和简答/编程题4题(每题7分),总分130分,考试时长120分钟。 摘要重点: 试卷涵盖数字IC设计的关键知识点,包括Verilog语法、时序逻辑、状态机设计、跨时钟域处理等; 题目解析详细说明了各选项的正确性,如非阻塞赋值特性(D错误)、功耗影响因素(C与组合逻辑级数弱相关)等; 包含实际工程问题,如DDR4接口电平(SSTL-1.2)、卡诺图变量排序(格雷码)等; 部分题目考察基础概念

Open 369

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

Spark RDD编程实战:巧用distinct与reduceByKey实现高效数据去重

本文详细介绍了Spark RDD编程中distinct与reduceByKey两种高效数据去重方法的实战应用。通过对比分析它们的性能差异、适用场景及优化技巧,帮助开发者在大数据处理中选择合适的去重策略,提升Spark作业执行效率。文章包含电商日志去重等实际案例,展示了如何应对数据倾斜等常见问题。

diyudong4681的博客 388

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

distinct和dropDuplicates

distinct数据去重 使用distinct:返回当前DataFrame中不重复的Row记录。该方法和接下来的dropDuplicates()方法不传入指定字段时的结果相同。 dropDuplicates:根据指定字段去重 跟distinct方法不同的是,此方法可以根据指定字段去重。例如我们想要去掉相同用户通过相同渠道下单的数据: df.dropDuplicates("user","type").show() 输出: +---+----+----+--------------------+ |

自渡 1731

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

spark中dropDuplicates和distinct的区别

spark中去重算子问题

NOT_GUY的博客 2452

distinct和dropDuplicates的区别

distinct和dropDuplicates都是用来进行去重的。 区别在于distinct是根据每一条数据进行完整内容的比对和去重,dropDuplicates可以根据指定的字段进行去重。 employeeDF.distinct().show() employeeDF.dropDuplicates(Seq("name")).show() ...

qq_56870570的博客 871

spark sql dropDuplicates distinct

object TypedOperation { case class Employee(name: String, age: Long, depId: Long, gender: String, salary: Long) def main(args: Array[String]): Unit = { println("astron") val spark = Spar...

dataastron的博客 6264

dataset的去重计数 g2_Spark Dataset DataFrame 操作

相关博文参考sparksql中dataframe的用法import groovy.sql.DataSetimport org.apache.log4j.{Level, Logger}import org.apache.spark.sql.{DataFrame, Row, SparkSession}object sparkSession {case class Person(name:String,...

weixin_30451613的博客 807

dataset的去重计数 g2_Spark之RDD、Dataset和DataFrame

names = people.map((Person p) -> p.name, Encoders.STRING));```#### 二、Encoder这里还介绍一个**Encoder**概念。Encoder是用来支持Dataset的领域对象的,我们知道,Dataset中的每一行可以当做一个Bean,这是需要`Encoder`来支撑的。它的作用是把领域对象`T`变成`Spark`内部的类型系...

weixin_42513928的博客 422

dataset的去重计数 g2_Spark2 Dataset去重、差集、交集

import org.apache.spark.sql.functions._// 对整个DataFrame的数据去重data.distinct()data.dropDuplicates()// 对指定列的去重val colArray=Array("affairs", "gender")data.dropDuplicates(colArray)//data.dropDuplicates("affa...

weixin_39636691的博客 176

dataset的去重计数 g2_Dataset操作--去重

[root@centos00 ~]$ cd /opt/cdh5.14.2/hadoop-2.6.0-cdh5.14.2/[root@centos00 hadoop-2.6.0-cdh5.14.2]$ sbin/hadoop-daemon.sh start namenode[root@centos00 hadoop-2.6.0-cdh5.14.2]$ sbin/hadoop-daemon.sh st...

weixin_39899244的博客 254

pyspark比较dropDuplicates()+count与count(Distinct)

pyspark , dropDuplicates()+ count与count(Distinct)计算速度和结果差异

Toby的博客 1285

reader 读到空值怎么处理_spark | 手把手教你用spark进行数据预处理

本文始发于个人公众号:TechFlow,原创不易,求个关注今天是spark专题的第七篇文章,我们一起看看spark的数据分析和处理。过滤去重在机器学习和数据分析当中,对于数据的了解和熟悉都是最基础的。所谓巧妇难为无米之炊,如果说把用数据构建一个模型或者是支撑一个复杂的上层业务比喻成做饭的话。那么数据并不是“米”,充其量最多只能算是未脱壳的稻。要想把它做成好吃的料理,必须要对原生的稻谷进行处理。但是...

weixin_28887297的博客 383
上一篇: spark 的 repartition
下一篇: ES教程:从入门到入土
Code_LT
博客等级 码龄10年 307粉丝 182原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值