Spark Sql之dropDuplicates去重

2023-11-20

算子介绍

dropDuplicates去重原则:按数据行的顺序保留每行数据出现的第一条
dropDuplicates 在Spark源码里面提供了以下几个方法重载:

 def dropDuplicates(): Dataset[T] = dropDuplicates(this.columns) 

这个方法,不需要传入任何的参数,默认根据所有列进行去重,然后按数据行的顺序保留每行数据出现的第一条。

def dropDuplicates(colNames: Seq[String]) 

传入的参数是一个序列。你可以在序列中指定你要根据哪些列的重复元素对数据表进行去重,然后也是返回每一行数据出现的第一条

def dropDuplicates(colNames: Array[String]) 

传入的参数是一个数组,然后方法会把数组转换为序列然后再调用第二个方法

def dropDuplicates(col1: String, cols: String*)

传入的参数为字符串,在方法体内会把你传入的字符串组合成一个序列再调用第二个方法。

示例

新建一个dataFrame

val conf = new SparkConf().setAppName("TTyb").setMaster("local")
val sc = new SparkContext(conf)
val spark = new SQLContext(sc)
val dataFrame = spark.createDataFrame(Seq(
  (1, 1, "2", "5"),
  (2, 2, "3", "6"),
  (2, 2, "35", "68"),
  (2, 2, "34", "67"),
  (2, 2, "38", "68"),
  (3, 2, "36", "69"),
  (1, 3, "4", null)
)).toDF("id", "label", "col1", "col2")

按照id和lable来去重。此时利用distinct是得不到想要的效果的
利用 dropDuplicates 可以实现

dataFrame.dropDuplicates(Seq("id","label")).show(false)

+---+-----+----+----+
|id |label|col1|col2|
+---+-----+----+----+
|2  |2    |3   |6   |
|1  |1    |2   |5   |
|1  |3    |4   |null|
|3  |2    |36  |69  |
+---+-----+----+----+

问题

问题: 分区多时对导致去重出现问题
需求:求最早时间段的那条数据

原数据:
+---------+----------+
|columnVal|dateStr   |
+---------+----------+
|0        |2019-01-01|
|1        |2019-01-01|
|2        |2019-01-01|
|3        |2019-01-01|
|4        |2019-01-01|
|0        |2019-02-01|
|1        |2019-02-01|
|2        |2019-02-01|
|3        |2019-02-01|
|4        |2019-02-01|
|0        |2019-03-01|
|1        |2019-03-01|
|2        |2019-03-01|
|3        |2019-03-01|
|4        |2019-03-01|
+---------+----------+

期望结果:
+---------+----------+
|columnVal|dateStr   |
+---------+----------+
|0        |2019-01-01|
|1        |2019-01-01|
|3        |2019-01-01|
|2        |2019-01-01|
|4        |2019-01-01|
+---------+----------+

错误复现:

# 可以看到下面效果跟预期 完全不符合

master("local[4]") //此时分区为4
df.dropDuplicates(Seq("columnVal","dateStr")).show(false)
+---------+----------+
|columnVal|dateStr   |
+---------+----------+
|3        |2019-02-01|
|1        |2019-02-01|
|4        |2019-03-01|
|0        |2019-01-01|
|4        |2019-01-01|
|0        |2019-02-01|
|4        |2019-02-01|
|3        |2019-01-01|
|1        |2019-01-01|
|2        |2019-01-01|
|3        |2019-03-01|
|2        |2019-02-01|
|0        |2019-03-01|
|1        |2019-03-01|
|2        |2019-03-01|
+---------+----------+

解决

方式一:

df.orderBy(col("dateStr")) //全局有序 只有一个reduce处理所有数据
      .dropDuplicates("columnVal")
      .show(false)

方式二:(基于方式一的优化)

    df.sortWithinPartitions(col("dateStr")) //每个分区有序
      .orderBy(col("dateStr")) //全局有序 只有一个reduce处理所有数据 此时压力会很小
      .dropDuplicates("columnVal") //去重
      .show(false)

dropDuplicates和distinct

  • distinct源码:
def distinct(): Dataset[T] = dropDuplicates()

def dropDuplicates(): Dataset[T] = dropDuplicates(this.columns)

可以看到底层调用的是dropDuplicates(this.columns)
而columns: Array[String] = schema.fields.map(_.name)
其实就是获取df的所有字段传进去。

参考

https://blog.csdn.net/qq_39900031/article/details/115797287

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Spark Sql之dropDuplicates去重 的相关文章

随机推荐

  • 5. 一线大厂高并发缓存架构实战与性能优化

    分布式缓存技术Redis 1 冷热数据分离 2 缓存设计 2 1 缓存击穿 失效 2 2 缓存穿透 2 3 缓存雪崩 3 大V直播带货导致线上商品系统崩溃原因分析 4 突发性热点缓存重建导致系统压力暴增问题 5 缓存数据库双写不一致问题 6
  • pytest+UI自动化测试结果回填到excel并发送excel测试报告邮件

    现在写的脚本是web UI自动化 这个和接口自动化区别非常大 没法像接口那样请求 返回 校验结果 UI自动化 一个用例跑下来 是页面 页面 页面 完成 这样 但是还是想实现一种结果回填到excel中 看测试结果就直接看excel就可以了 一
  • WPF 路径动画PathAnimations的使用

    在wpf中让一个控件按照一定的路径运行的动画 叫做路径动画 这个示例演示了让一个rectangle按照一个s形曲线反复运行的动画 效果 只有一个文件 全部代码如下
  • 第三章 创建主窗口

    创建一个主窗口 具有菜单 工具栏 状态栏和对话框之类的界面和功能 实现电子制表软件的主窗口框架 效果 mainwindow h 头文件就不做太多解释 以注释的方式解释函数 ifndef MAINWINDOW H define MAINWIN
  • 收藏!超全机器学习资料合集!(附下载)

    来源 机器学习算法与自然语言处理 本文长度为1098字 建议阅读3分钟 本文为你分享机器学习爱好者必备的资源 最近在群里发现一些小伙伴在寻找资料的时候总是无处可找 网上出现很多收集免费资料再去打包收钱的人 我看不惯这样的人 所以把自己收集的
  • 深度学习03—手写数字识别实例(Tensorflow版实验)

    目录 0 实验概述 1 利用Tensorflow自动加载mnist数据集 2 手写数字识别体验 2 1 准备网络结构与优化器 2 2 计算损失函数与输出 2 3 梯度计算与优化 2 4 循环 2 5 完整代码 补充 os environ T
  • linux学习2:定时任务

    1 crontab命令 crontab e 编辑crontab定时任务 crontab l 查询定人任务 crontab r 删除当前用户所有的定时任务 1 1 每分钟将home路径下的详细信息保存到 home ls txt中 cronta
  • prometheus告警模块ALTERMANAGER中抑制规则的使用

    prometheus服务端通过配置文件可以设置告警 下面是一个告警设置的配置文件alert yml groups name goroutines monitoring rules alert TooMuchGoroutines expr g
  • 【算法】动态规划

    动态规划的定义 动态规划是运筹学的一个分支 是求解决策过程的最优化的数学方法 20世纪50年代初美国数学家R E Bellman等人在研究多阶段决策过程的优化问题时 提出了著名的最优化原理 把多阶段过程转化为一系列单阶段问题 利用各阶段之间
  • 漏洞扫描工具大全,妈妈再也不用担心我挖不到漏洞了

    1 常见漏洞扫描工具 NMAP AWVS Appscan Burpsuite x ray Goby 2 端口扫描之王NMAP Nmap是一款非常强大的实用工具 包含的功能如下 主机探测 端口扫描 服务版本扫描 主机系统指纹识别 密码破解 漏
  • 机器学习 day27(反向传播)

    1 导数 函数在某点的导数为该点处的斜率 用height width表示 可以看作若当w增加 J w b 增加k倍的 则k为该点的导数 2 反向传播 tensorflow中的计算图 由有向边和节点组成 从左向右为正向传播 神经网络模型使用正
  • 程序员的浪漫—利用Matlab 实现圣诞树动态显示

    一 前言 圣诞节是基督教纪念耶稣诞生的重要节日 亦称耶稣圣诞节 主降生节 天主教亦称耶稣圣诞瞻礼 耶稣诞生的日期 圣经 并无记载 公元336年罗马教会开始在12月25日过此节 12月25日原是罗马帝国规定的太阳神诞辰 有人认为选择这天庆祝圣
  • MES11大标准模块(ISA95)

    1 资源分配及状态管理 ResourceAllocationandStatus 该功能管理机床 工具 人员物料 其它设备以及其它生产实体 满足生产计划的要求对其所作的预定和调度 用以保证生产的正常进行 提供资源使用情况的历史记录和实时状态信
  • vue3手动封装一个点击滚动,左右切换的商品展示效果图,纯js

    展示效果 效果图如下 默认展示第一张图片 只有两边有按钮切换 也可以点击图片切换 点击的图片从第三个开始时居中显示 分析一波 从底部的第三张图片开始到末尾的第八张图片都是居中显示 点击左右要进行切换 也要居中显示 所以我在这里用的的时在X轴
  • Linux Gadget驱动分析

    以下四篇文章需要互相补充 可以理解的较为详细 http blog sina com cn s blog 1519163d30102x2le html https www cnblogs com haoxing990 p 8799133 ht
  • C++:指向类的成员的指针

    引 想必接触过C的朋友们对C语言中指针的概念已经有了深入的了解 如果初步进行了解的朋友可以看一下 C语言基础学习笔记 指针展开来讲的基本知识点包括 指针的概念 指针的定义和初始化及简单使用 指针函数和函数指针 有关指针函数和函数指针的内容上
  • matlab_数据拟合

    多项式拟合 polyfit X Y N 多项式拟合 返回降幂排列的多项式系数 polyval P xi 计算多项式的值 function example x y P polyfit x y 3 xi 0 0 2 10 yi polyval
  • 小波变换详解

    小波变换详解 1 简介 We can use the Fourier Transform to transform a signal from its time domain to its frequency domain The peak
  • 微信聊天记录导出为电脑txt文件教程

    本文的最终目的是将手机微信的聊天记录导出到电脑里 变成txt文本文件 然后对其进行分析 网上有一些工具也可以完成这个功能 但是基本都是付费的 手动操作的话 找了很多的博客 基本没有完全有效的 最终找到一篇很靠谱的教程 小米手机提取微信聊天记
  • Spark Sql之dropDuplicates去重

    文章目录 算子介绍 示例 问题 解决 dropDuplicates和distinct 参考 算子介绍 dropDuplicates去重原则 按数据行的顺序保留每行数据出现的第一条 dropDuplicates 在Spark源码里面提供了以下