Вы можете указать выражение, которое следует использовать в соединении
подпись для этого
def join(right: Dataset[_], joinExprs: Column): DataFrame
Например,
val df1 = Seq(
("a1", "b1"),
("a2", "b2")
).toDF("a", "b")
val df2 = Seq(
("b1", "a1"),
("b2", "a2")
).toDF("b1", "a1")
df1.show
df2.show
выход
+---+---+
| a| b|
+---+---+
| a1| b1|
| a2| b2|
+---+---+
+---+---+
| b1| a1|
+---+---+
| b1| a1|
| b2| a2|
+---+---+
Вы можете создать любое выражение, которое хотите, и предоставить ему присоединение
val expression = df1("a") === df2("a1")
val result = df1 join (df2, expression)
result.show
выход
+---+---+---+---+
| a| b| b1| a1|
+---+---+---+---+
| a1| b1| b1| a1|
| a2| b2| b2| a2|
+---+---+---+---+
UPD:
Вы можете использовать createOrReplaceTempView
Например
df1.createOrReplaceTempView("df1")
df2.createOrReplaceTempView("df2")
val res = spark.sql("select * from df1 inner join df2 on df1.a == df2.a1")
res.show
выход
+---+---+---+---+
| a| b| b1| a1|
+---+---+---+---+
| a1| b1| b1| a1|
| a2| b2| b2| a2|
+---+---+---+---+
Результат будет таким же, и вы можете предоставить SQL-запрос в виде строки