Найти общие строки, в которых все три столбца соответствуют, например, id 1,2 в приведенном выше примере.
это довольно просто, вам просто нужно проверить все столбцы на равенство при объединении
df1.join(df2, df1("id") === df2("exId") && df1("amount") === df2("exAmount") && df1("fee") === df2("exFee")).show(false)
что должно дать вам
+---+------+---+----+--------+-----+
|id |amount|fee|exId|exAmount|exFee|
+---+------+---+----+--------+-----+
|1 |10.00 |5.0|1 |10.00 |5.0 |
|2 |20.0 |3.0|2 |20.0 |3.0 |
+---+------+---+----+--------+-----+
Найдите общие строки, в которых (id, exId) совпадают, но другие не соответствуют, например, например. 3 и 4 в приведенном выше примере. Было бы полезно, если бы мы определили, какой из столбцов не совпадает.
для этого вам нужно проверить равенство для первого столбца , но en-равенство для остальных двух столбцов и выполнить некоторое при условии получения последнего столбца
import org.apache.spark.sql.functions._
df1.join(df2, df1("id") === df2("exId") && (df1("amount") =!= df2("exAmount") || df1("fee") =!= df2("exFee")))
.withColumn("mismatchFields", when(col("amount") =!= col("exAmount") && col("fee") =!= col("exFee"), array(lit("amount"), lit("fee"))).otherwise(
when(col("amount") === col("exAmount") && col("fee") =!= col("exFee"), array(lit("fee"))).otherwise(array(lit("amount")))
)).show(false)
что должно дать вам
+---+------+-----+----+--------+-----+--------------+
|id |amount|fee |exId|exAmount|exFee|mismatchFields|
+---+------+-----+----+--------+-----+--------------+
|3 |90 |130.0|3 |20.0 |3.0 |[amount, fee] |
|4 |120.0 |35.0 |4 |120.0 |3.0 |[fee] |
+---+------+-----+----+--------+-----+--------------+
Надеюсь, ответ полезен