SparkSql系列(7/25) 去重方法

标签: bigdata scala spark | 发表时间:2021-08-24 23:02 | 作者:admin
出处:https://www.deeplearn.me

消除重复的数据可以通过使用 distinctdropDuplicates 两个方法,二者的区别在于, distinct 是所有的列进行去重的操作,假如你的 DataFrame里面有10列,那么只有这10列完全相同才会去重, dropDuplicates 则是可以指定列进行去重,相当于是 distinct 的缩小版

构建 DataFrame

import spark.implicits._

val simpleData = Seq(("James", "Sales", 3000),
  ("Michael", "Sales", 4600),
  ("Robert", "Sales", 4100),
  ("Maria", "Finance", 3000),
  ("James", "Sales", 3000),
  ("Scott", "Finance", 3300),
  ("Jen", "Finance", 3900),
  ("Jeff", "Marketing", 3000),
  ("Kumar", "Marketing", 2000),
  ("Saif", "Sales", 4100)
)
val df = simpleData.toDF("employee_name", "department", "salary")
df.show()

输出如下所示:

+-------------+----------+------+
|employee_name|department|salary|
+-------------+----------+------+
|        James|     Sales|  3000|
|      Michael|     Sales|  4600|
|       Robert|     Sales|  4100|
|        Maria|   Finance|  3000|
|        James|     Sales|  3000|
|        Scott|   Finance|  3300|
|          Jen|   Finance|  3900|
|         Jeff| Marketing|  3000|
|        Kumar| Marketing|  2000|
|         Saif|     Sales|  4100|
+-------------+----------+------+

1. 使用 distinct 去重

//Distinct all columns
val distinctDF = df.distinct()
println("Distinct count: "+distinctDF.count())
distinctDF.show(false)

distinct() 函数会返回一个新的 DataFrame ,而不是原地修改。

Distinct count: 9
+-------------+----------+------+
|employee_name|department|salary|
+-------------+----------+------+
|James        |Sales     |3000  |
|Michael      |Sales     |4600  |
|Maria        |Finance   |3000  |
|Robert       |Sales     |4100  |
|Saif         |Sales     |4100  |
|Scott        |Finance   |3300  |
|Jeff         |Marketing |3000  |
|Jen          |Finance   |3900  |
|Kumar        |Marketing |2000  |
+-------------+----------+------+

或者你不指定 dropDuplicates 的参数,也是可以达到上面的效果

val df2 = df.dropDuplicates()
println("Distinct count: "+df2.count())
df2.show(false)

2. 使用 dropDuplicates 按照指定列进行去重

distinct 一样,函数都会返回一个新的 DataFrame

//Distinct using dropDuplicates
val dropDisDF = df.dropDuplicates("department","salary")
println("Distinct count of department & salary : "+dropDisDF.count())
dropDisDF.show(false)

结果如下所示:

Distinct count of department & salary : 8
+-------------+----------+------+
|employee_name|department|salary|
+-------------+----------+------+
|Jen          |Finance   |3900  |
|Maria        |Finance   |3000  |
|Scott        |Finance   |3300  |
|Michael      |Sales     |4600  |
|Kumar        |Marketing |2000  |
|Robert       |Sales     |4100  |
|James        |Sales     |3000  |
|Jeff         |Marketing |3000  |
+-------------+----------+------+

3. 完整的示例代码

import org.apache.spark.sql.SparkSession
import org.apache.spark.sql.functions._

object SQLDistinct extends App {

  val spark: SparkSession = SparkSession.builder()
    .master("local[1]")
    .appName("SparkByExamples.com")
    .getOrCreate()

  spark.sparkContext.setLogLevel("ERROR")

  import spark.implicits._

  val simpleData = Seq(("James", "Sales", 3000),
    ("Michael", "Sales", 4600),
    ("Robert", "Sales", 4100),
    ("Maria", "Finance", 3000),
    ("James", "Sales", 3000),
    ("Scott", "Finance", 3300),
    ("Jen", "Finance", 3900),
    ("Jeff", "Marketing", 3000),
    ("Kumar", "Marketing", 2000),
    ("Saif", "Sales", 4100)
  )
  val df = simpleData.toDF("employee_name", "department", "salary")
  df.show()

  //Distinct all columns
  val distinctDF = df.distinct()
  println("Distinct count: "+distinctDF.count())
  distinctDF.show(false)

  val df2 = df.dropDuplicates()
  println("Distinct count: "+df2.count())
  df2.show(false)

  //Distinct using dropDuplicates
  val dropDisDF = df.dropDuplicates("department","salary")
  println("Distinct count of department & salary : "+dropDisDF.count())
  dropDisDF.show(false)

}

相关 [sparksql 系列 方法] 推荐:

SparkSql系列(7/25) 去重方法

- - 算法之道
消除重复的数据可以通过使用 distinct 和 dropDuplicates 两个方法,二者的区别在于, distinct 是所有的列进行去重的操作,假如你的 DataFrame里面有10列,那么只有这10列完全相同才会去重, dropDuplicates 则是可以指定列进行去重,相当于是 distinct 的缩小版.

Spark入门实战系列--6.SparkSQL(下)--Spark实战应用 - shishanyuan - 博客园

- -
【注】该系列文章以及使用到安装包/测试数据 可以在《. 倾情大奉送--Spark入门实战系列》获取. l 主机操作系统:Windows 64位,双核4线程,主频2.2G,10G内存. l 虚拟软件:VMware® Workstation 9.0.0 build-812388. l 虚拟机操作系统:CentOS 64位,单核.

presto、druid、sparkSQL、kylin的对比分析,如性能、架构等,有什么异同? - 知乎

- -
这几个框架都是OLAP大数据分析比较常见的框架,各自特点如下:. presto:facebook开源的一个java写的分布式数据查询框架,原生集成了Hive、Hbase和关系型数据库,Presto背后所使用的执行模式与Hive有根本的不同,它没有使用MapReduce,大部分场景下比hive快一个数量级,其中的关键是所有的处理都在内存中完成.

[MySQL优化案例]系列 — slave延迟很大优化方法

- - MySQL中文网
备注:插图来自网络搜索,如果觉得不当还请及时告知 :). 一般而言,slave相对master延迟较大,其根本原因就是slave上的复制线程没办法真正做到并发. 简单说,在master上是并发模式(以InnoDB引擎为主)完成事务提交的,而在slave上,复制线程只有一个sql thread用于binlog的apply,所以难怪slave在高并发时会远落后master.

常见SQL注入方法整理系列-初始篇

- - FreeBuf.COM | 关注黑客与极客
前面介绍了MSSQL、MYSQL以及ORACLE的一些涉及安全体系的基本知识,且当作知识的积累或者温故吧. 本篇主要介绍这三种数据库的攻击手法,力求形成一套攻击流程,当然流程是死的,在真实的攻击环境中还是需要发挥聪明才智的,所以也且当作参考笔记吧. 万事开头难,SQL注入攻击同样如此. 给定一个WEB站点URL,发现该站点SQL注入漏洞最快的方法莫过于使用扫描工具,最有效的我自认为是查看应用程序源代码.

[原]Lucene系列-facet

- - 文武天下
facet:面、切面、方面. 个人理解就是维度,在满足query的前提下,观察结果在各维度上的分布(一个维度下各子类的数目). 如jd上搜“手机”,得到4009个商品. 其中品牌、网络、价格就是商品的维度(facet),点击某个品牌或者网络,获取更细分的结果. 点击品牌小米,获得小米手机的结果,显示27个.

[原]Lucene系列-FieldCache

- - 文武天下
域缓存,加载所有文档中某个特定域的值到内存,便于随机存取该域值. 当用户需要访问各文档中某个域的值时,IndexSearcher.doc(docId)获得Document的所有域值,但访问速度比较慢,而且只能获得Stored域的值. FieldCache能获得域值数组,根据docId random access域值.

google全系列hosts列表

- 佳 - cooerson的各种聚合
整理了一下Google(含google大部分服务,google+,gmail,地图,gtalk等~)的hosts. 可以通过添加hosts方式,享受谷歌产品,这样读图会快很多,gmail也能随时打开了,不会出现链接不上情况了,更不用番强了. windows下修改hosts文件,添加固定的DNS解析.

可爱的Pusheen猫系列

- apple - 鸸鹋动物园
全部都会动,全部都会哦~~ (via). 还有Pusheen猫的QQ表情. © Salala for 鸸鹋动物园, 2011. 转发本文地址 可爱的Pusheen猫系列 http://www.ermiao.com/gallery/20110901/21594.html. 本文标签:Pusheen, 猫, 表情.

This man is your FRIEND系列海报

- Edward - hUrR DuRr
Fallout: New Vegas乱入:. Team Fortress 2乱入:. reddit上真是什么奇葩的subreddit都有:r/PropagandaPosters.