scala - 执行 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,考虑到年份和月份
解决方案
线
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 列不是您用来删除重复项的三列的一部分。显然,您的数据框中的日期在三列中共享相同的值,但在年份中有所不同。删除重复项不是一个确定性的过程,它取决于数据的顺序,这些数据在每次运行代码时都会有所不同。
推荐阅读
- angular - 注入 ActivatedRoute 会产生循环依赖错误
- algorithm - 将数字 (x1, x2, x3, ...) 分配给列表 (a1, a2, a3, ...) 中的每个元素,以便 a1/x1 类似于 a2/x2 等等
- javascript - 如何处理 Django Web 应用程序中数据库的实时搜索?
- javascript - 如何将 state 属性设置为 false
- sql - 有多少比特币从一个钱包转移到另一个钱包?
- python - 如何找到一个数的最大可能奇数
- javascript - 通过 jQuery 获取重定向的 URL
- excel - 如何将此公式转换为 VBA 代码?
- python-2.7 - 如何在组合框的输入功能中搜索完成时接受小写字符
- angular - Angular 7在组件的模板端获取元素ID值