Как выбрать динамические столбцы во время спарк-соединения? - PullRequest
0 голосов
/ 08 февраля 2019

Я пытаюсь соединить 2 фрейма данных, в 1-м DF мне нужно передать динамический номер столбца и соединить его с другим DF.Сложность, с которой я здесь сталкиваюсь, у меня есть инструкция case с выводом 1st DF.Я могу получить желаемый результат путем создания временного представления.Но не в состоянии достичь того же результата через искру.

Ниже приведен фрагмент кода, я пробовал и работает, как ожидалось.

// Sample DF1
val studentDF = Seq(
  (1, "Peter","M",15,"Tution Received"),
  (2, "Merry","F",14,null),
  (3, "Sam","M",16,"Tution Received"),
  (4, "Kat","O",16,null),
   (5, "Keivn","M",18,null)
).toDF("Enrollment", "Name","Gender","Age","Notes")

//Sample DF2
val studentFees = Seq((1,"$500","Deposit"),(2, "$800","Deposit"),(3,"$200","Deposit"),(4,"$100","Deposit")).toDF("Enrollment","Fees","Notes")

studentDF.createOrReplaceTempView("STUDENT")
studentFees.createOrReplaceTempView("FEES")

val displayColumns = List("Enrollment","Name","Gender").map("a."+_).reduce(_+","+_)
val queryStr = spark.sql(s"select $displayColumns, case when a.Notes is null then b.Notes else a.Notes end as Notes, b.Fees from STUDENT a join FEES b on a.Enrollment=b.Enrollment")
queryStr.show()

---------+-----+------+---------------+----+
|Enrollment| Name|Gender|          Notes|Fees|
+----------+-----+------+---------------+----+
|         1|Peter|     M|Tution Received|$500|
|         2|Merry|     F|        Deposit|$800|
|         3|  Sam|     M|Tution Received|$200|
|         4|  Kat|     O|        Deposit|$100|
+----------+-----+------+---------------+----+

// Below is not giving the desired output
val displayColumns = List("Enrollment","Name","Gender","Notes")
val queryStr = studentDF.select(displayColumns.head, displayColumns.tail: _*).alias("a").join(studentFees.as("b"),Seq("Enrollment"),"inner").withColumn("Notes",when($"a.Notes".isNull,$"b.Notes").otherwise($"a.Notes"))
queryStr.show()


Enrollment| Name|Gender|          Notes|Fees|          Notes|
+----------+-----+------+---------------+----+---------------+
|         1|Peter|     M|Tution Received|$500|Tution Received|
|         2|Merry|     F|        Deposit|$800|        Deposit|
|         3|  Sam|     M|Tution Received|$200|Tution Received|
|         4|  Kat|     O|        Deposit|$100|        Deposit|
+----------+-----+------+---------------+----+---------------+

// Expecting the output like below. 
---------+-----+------+---------------+----+
|Enrollment| Name|Gender|          Notes|Fees|
+----------+-----+------+---------------+----+
|         1|Peter|     M|Tution Received|$500|
|         2|Merry|     F|        Deposit|$800|
|         3|  Sam|     M|Tution Received|$200|
|         4|  Kat|     O|        Deposit|$100|
+----------+-----+------+---------------+----+

Есть ли лучший способ справиться с такойсценарии вместо создания временной таблицы / представлений?

1 Ответ

0 голосов
/ 08 февраля 2019

Спасибо всем, кто прочитал мой пост !!Я смог найти решение для моей проблемы.

val displayColumns = List("Enrollment","Name","Gender","Notes")
val queryStr = studentDF.select(displayColumns.head, displayColumns.tail: _*).alias("a").join(studentFees.as("b"),Seq("Enrollment"),"inner").select($"a.*",when($"a.Notes".isNull,$"b.Notes").otherwise($"a.Notes").as("Notes"),$"b.Fees").drop($"a.Notes")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...