Как добавить строковый столбец в строковый столбец массива в Scala Spark без использования UDF? - PullRequest
1 голос
/ 18 мая 2019

У меня есть таблица, в которой есть столбец, содержащий массив, подобный этому -

Student_ID | Subject_List        | New_Subject
1          | [Mat, Phy, Eng]     | Chem

Я хочу добавить новый предмет в список тем и получить новый список.

Созданиеdataframe -

val df = sc.parallelize(Seq((1, Array("Mat", "Phy", "Eng"), "Chem"))).toDF("Student_ID","Subject_List","New_Subject")

Я пробовал это с UDF следующим образом -

def append_list = (arr: Seq[String], s: String) => {
    arr :+ s
  }

val append_list_UDF = udf(append_list)

val df_new = df.withColumn("New_List", append_list_UDF($"Subject_List",$"New_Subject"))

С UDF я получаю необходимый вывод

Student_ID | Subject_List        | New_Subject | New_List
1          | [Mat, Phy, Eng]     | Chem        | [Mat, Phy, Eng, Chem]

Можем ли мы это сделатьбез udf?Спасибо.

Ответы [ 2 ]

2 голосов
/ 18 мая 2019

В Spark 2.4 или более поздней версии комбинация array и concat должна добиться цели,

import org.apache.spark.sql.functions.{array, concat}
import org.apache.spark.sql.Column

def append(arr: Column, col: Column) = concat(arr, array(col))

df.withColumn("New_List", append($"Subject_List",$"New_Subject")).show
+----------+---------------+-----------+--------------------+                   
|Student_ID|   Subject_List|New_Subject|            New_List|
+----------+---------------+-----------+--------------------+
|         1|[Mat, Phy, Eng]|       Chem|[Mat, Phy, Eng, C...|
+----------+---------------+-----------+--------------------+

, но я не ожидаю здесь серьезного прироста производительности.

0 голосов
/ 20 мая 2019
 val df = Seq((1, Array("Mat", "Phy", "Eng"), "Chem"),
  (2, Array("Hindi", "Bio", "Eng"), "IoT"),
  (3, Array("Python", "R", "scala"), "C")).toDF("Student_ID","Subject_List","New_Subject")
df.show(false)
val final_df = df.withColumn("exploded", explode($"Subject_List")).select($"Student_ID",$"exploded")
  .union(df.select($"Student_ID",$"New_Subject"))
  .groupBy($"Student_ID").agg(collect_list($"exploded") as "Your_New_List").show(false)
[enter code here][1]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...