В соответствии с API документами df1.except (df2), возвращает новый DataFrame, содержащий строки в этом кадре, но не в другом кадре. т.е. он вернет строки, которые находятся в DF1, а не в DF2. Таким образом, пользовательская функция кроме может быть записана как:
def except(df1: DataFrame, df2: DataFrame): DataFrame = {
val edf1 = df1.except(df2).withColumn("df", lit("df1"))
val edf2 = df2.except(df1).withColumn("df", lit("df2"))
edf1.union(edf2)
}
//Output
+---+---+---+
| A| B| df|
+---+---+---+
| 3| o|df1|
| 3| p|df2|
+---+---+---+