Как получить ключ объединения в левом соединении в Apache Spark

#scala #apache-spark

#scala #apache-spark

Вопрос:

У меня с собой приведенный ниже DF —

scala> значение df1= Seq( («1″,»1_10»), («1″,»1_11»), («2″,»2_20»), («3″,»3_30»), («3″,»3_31») ) toDF(«c1″,»c2»)

  --- ---- 
| c1|  c2|
 --- ---- 
|  1|1_10|
|  1|1_11|
|  2|2_20|
|  3|3_30|
|  3|3_31|
 --- ---- 
 

значение df2=Seq(
(«2″,»200»),
(«3″,»300»)
)toDF(«c1», «val»)

  --- --- 
| c1| val|
 --- --- 
|  2|200|
|  3|300|
 --- --- 
 

Если я сделаю левое соединение, я получу результат, как показано ниже.

   scala> df1.join(df2,Seq("c1"),"left").select(df1("c1").alias("df1_c1"),df1("c2"),df2("val")).show
 ------ ---- ---- 
|df1_c1|  c2| val|
 ------ ---- ---- 
|     1|1_10|null|
|     1|1_11|null|
|     2|2_20| 200|
|     3|3_30| 300|
|     3|3_31| 300|
 ------ ---- ---- 
 

Но как я мог получить ключ соединения val правой таблицы?

Ожидаемый результат —

  ------ ---- ---- ------ 
|df1_c1|  c2| val|df2_c1|
 ------ ---- ---- ------ 
|     1|1_10|null|  null|
|     1|1_11|null|  null|
|     2|2_20| 200|     2|
|     3|3_30| 300|     3|
|     3|3_31| 300|     3|
 ------ ---- ---- ------ 

If I try ,  df1.join(df2,Seq("c1"),"left").select(df1("c1").alias("df1_c1"),df1("c2"),df2("val"),df2("c1")).show,
 

Я получу следующую ошибку —

 org.apache.spark.sql.AnalysisException: Resolved attribute(s) c1#19639 missing from c1#19630,c2#19631,val#19640 in operator !Project [c1#19630 AS df1_c1#19667, c2#19631, val#19640, c1#19639]. Attribute(s) with the same name appear in the operation: c1. Please check if the right attribute(s) are used.;
 

Ответ №1:

Spark удаляет повторяющиеся столбцы, если вы используете последовательность столбцов Seq («c1») для объединения. Вместо этого вы можете использовать пользовательское выражение соединения:

 df1.as("df1").join(df2.as("df2"), expr("df1.c1 == df2.c1"),"left").select($"df1.c1".alias("df1_c1"), $"df1.c2", $"df2.c1".as("df2_c1"), $"df2.val").show(false)