Вы можете добавить в объединение дополнительное условие, которое содержит только одну из двух строк, например name_x
Пример кадра данных:
val rowsRdd: RDD[Row] = spark.sparkContext.parallelize(
Seq(
Row(1, "James", 1, 10),
Row(1, "Jack", 2, 20),
Row(2, "Tom", 3, 30),
Row(2, "Eva", 4, 40)
)
)
val schema: StructType = new StructType()
.add(StructField("id", IntegerType, false))
.add(StructField("name", StringType, false))
.add(StructField("age", IntegerType, false))
.add(StructField("salary", IntegerType, false))
val df0: DataFrame = spark.createDataFrame(rowsRdd, schema)
df0.sort("id").show()
, который дает:
+---+-----+---+------+
| id| name|age|salary|
+---+-----+---+------+
| 1|James| 1| 10|
| 1| Jack| 2| 20|
| 2| Eva| 4| 40|
| 2| Tom| 3| 30|
+---+-----+---+------+
Переименовать столбцы кадра данных:
val df1 = df0.columns.foldLeft(df0)((acc, x) => acc.withColumnRenamed(x, x+"_x"))
val df2 = df0.columns.foldLeft(df0)((acc, x) => acc.withColumnRenamed(x, x+"_y"))
Затем выполните объединение с тремя условиями:
val df3 = df1.join(df2,
col("id_x") === col("id_y") and
col("name_x") =!= col("name_y") and
col("name_x") < col("name_y"),
"inner")
df3.show()
, которое возвращает
+----+------+-----+--------+----+------+-----+--------+
|id_x|name_x|age_x|salary_x|id_y|name_y|age_y|salary_y|
+----+------+-----+--------+----+------+-----+--------+
| 1| Jack| 2| 20| 1| James| 1| 10|
| 2| Eva| 4| 40| 2| Tom| 3| 30|
+----+------+-----+--------+----+------+-----+--------+
В зависимости от того, как вы определяете дубликат в ваших данных, условие, которое различает два дубликата, будет различным.