我有以下代码:
val df = spark.read
.format("com.microsoft.sqlserver.jdbc.spark")
.option("url", url)
.option("dbtable", table)
.option("user", username)
.option("password", password).load()
df.where(col("code") === "XFH").show()
df.dropDuplicates("code").where(col("code") === "XFH").show()
我的数据有两个用于code == XFH
的条目,所以我希望第一场演出返回两行,第二场返回一行。但是,我第一次得到两个,然后第二次得到零(即,它删除了两个重复项)。
如果我尝试以下操作,它将按预期工作,因此我认为这与拥有多列有关(尽管我无法通过虚拟数据集重现该问题):
df.select("code").dropDuplicates("code").where(col("acf_code") === "code").show()
有什么主意我在做错什么,以及如何解决它,以便我的数据框仅包含单个XFH实例?
更新:我也尝试过按照@GamingFelix的建议分为多个阶段。
val dedupDf = df.dropDuplicates("code")
println(df.count())
// Prints 694
println(dedupDf.count())
// Prints 692
只有一行是重复的,因此看起来它仍在删除这两行。
更新2:
看来不是问题dropDuplicates
,而是其他奇怪的事情发生了。
df.where(col("code") === "XFH").show()
// Returns 2 results
df.dropDuplicates("code").where(col("code") === "XFH").show()
// Returns 0 results
df.dropDuplicates("code").where(trim(col("code")) === "XFH").show()
// Returns 1 result, as desired
即使第一个语句的相等性测试在没有它的情况下也可以正常工作(即,没有要修剪的空间),我真的不明白为什么我需要将列包裹在修剪中。