首页 > 解决方案 > 执行 dropDuplicates() 后,计数时得到不同的计数

问题描述

Region,store我在数据框中使用, 和的子集做了 dropDuplicates id

数据框包含其他一些列,例如latitude, longitude, address, Zip, Year, Month...

当我对派生数据框进行计数时,我得到一个常数值,但是当我计算选定年份的计数时,比如 2018 年,在运行df.count()

谁能解释为什么会这样?

Df.dropDuplicates("region","store","id")

Df.createOrReplaceTempView(Df)
spark.sql("select * from Df").count() is constant 

每当我跑步

但是,如果我将 where 子句放在 Year 或 Month 内,我会得到多个计数。

例如:

spark.sql("select * from Df where Year =2018").count()

该语句在每次执行时给出多个值。中间输出 Region store objectnr latitude longitude newid month year uid Abc 20 4572 46.6383 8.7383 1 4 2018 0 Sgs 21 1425 47.783 6.7282 2 5 2019 1 Efg 26 1277 48.8293 8.2727 3 7 201

输出

区域存储 objectnr 纬度经度 newid 月年 uid Abc 20 4572 46.6383 8.7383 1277 4 2018 0 Sgs 21 1425 47.783 6.7282 1425 5 2019 1 Efg 26 1277 48.8293 7 2027 2271 7

所以这里newid获取objecrnr的值,当newid相同时,我需要将最新的objectnr分配给newid,考虑到年份和月份

标签: scaladataframeapache-sparkapache-spark-sql

解决方案


线

Df.dropDuplicates("region","store","id")

创建一个新的数据框,它不会修改现有的数据框。数据帧是不可变的。

要解决您的问题,您需要将 dropDuplicates 语句的输出保存到新的 Dataframe 中,如下所示:

val Df2 = Df.dropDuplicates("region","store","id") 
Df2.createOrReplaceTempView(Df2) 
spark.sql("select * from Df2").count()

此外,在应用过滤器 Year=2018 时,您可能会得到不同的计数,因为 Year 列不是您用来删除重复项的三列的一部分。显然,您的数据框中的日期在三列中共享相同的值,但在年份中有所不同。删除重复项不是一个确定性的过程,它取决于数据的顺序,这些数据在每次运行代码时都会有所不同。


推荐阅读