Spark Drop重复项删除所有行

时间:2020-07-23 10:52:10

标签: scala apache-spark apache-spark-sql

我有以下代码:

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

即使第一个语句的相等性测试在没有它的情况下也可以正常工作(即,没有要修剪的空间),我真的不明白为什么我需要将列包裹在修剪中。

0 个答案:

没有答案
相关问题