如何将连接条件作为参数传递给spark数据帧连接

时间:2017-04-28 08:22:36

标签: scala apache-spark join parameter-passing apache-spark-sql

我想按如下方式进行广播加入:

val z = main.as("m").join(broadcast(df.as("i")), $"m.sno" === $"i.sno", "left_outer")

但我希望将连接条件$"m.sno" === $"i.sno"作为参数传递。

我尝试了以下方法: 第一

val cond = """ $"m.sno" === $"i.sno" """
val z = main.as("m").join(broadcast(df.as("i")), $cond, "left_outer")

我发现连接中的参数必须是列。所以我将它转换为专栏并尝试了。

val c = col(c)
val z = main.as("m").join(broadcast(df.as("i")), c, "left_outer")

我仍然收到错误。如何解决这个问题。 注意:' cond'变量将是String。

2 个答案:

答案 0 :(得分:1)

如果连接列名相同,则下面的语法将使用完整。

val joincond=Seq("SNO")
df1.join(df2,joincond,"inner");

如果连接列名称不同,请使用以下语法。

val cond="SNO=SOME_OTHER_COLUMN"
df1.join(df2,expr(cond),"inner");

答案 1 :(得分:0)

如果我们混合使用具有相同名称和不同名称的列,并且必须按如下所示执行联接,那么该怎么办:

Table A -> (a, b, c1, d1, e1) Table B -> (a, b, c2, d2, e2)

加入条件-> ((A.a===B.a) && (A.b===B.b) && (A.c1===B.c2) && (A.d1===A.d2))