如何在scala中使用spark dataframe查找对称的重复列(2列)?

dxxyhpgq  于 2021-07-12  发布在  Spark
关注(0)|答案(2)|浏览(396)

我有下面的dataframe,它有两列。
输入Dataframe:

col1,col2
1,2
2,3
7,0
2,1

在上面的Dataframe中,第一行和第四行是对称的,应该只考虑一次。我们可以使用输出中的第一行或第四行。
可能的输出Dataframe。
可能性1:

col1,col2
2,3
7,0
2,1

可能性2:

col1,col2
1,2
2,3
7,0
xe55xuns

xe55xuns1#

你可以打电话 dropDuplicates 在排序的数组列上:

val df2 = df.withColumn(
    "arr", 
    sort_array(array(col("col1"), col("col2")))
).dropDuplicates("arr").drop("arr")

df2.show
+----+----+
|col1|col2|
+----+----+
|   2|   3|
|   1|   2|
|   7|   0|
+----+----+
f2uvfpb9

f2uvfpb92#

你可以用 row_number 隔着Windows的 least 以及 greatest 值来自 col1 以及 col2 :

import org.apache.spark.sql.expressions.Window

val w = Window
  .partitionBy(least($"col1", $"col2"), greatest($"col1", $"col2"))
  .orderBy(lit(null))

val df1 = df
  .withColumn("rn", row_number().over(w))
  .filter("rn = 1")
  .drop("rn")

df1.show
//+----+----+
//|col1|col2|
//+----+----+
//|   2|   3|
//|   1|   2|
//|   7|   0|
//+----+----+

也可以按排序的数组列进行分区:

val w = Window
  .partitionBy(array_sort(array($"col1", $"col2")))
  .orderBy(lit(null))

相关问题