Соедините несколько свечей DFC, объедините столбец массива с объединением всех значений - PullRequest
0 голосов
/ 10 октября 2019

Допустим, у моих dfs есть два столбца: id (int) и names (array [string])

df1: 
1 []
3 ['alice']
4 ['bob']

df2: 
1 ['jack']
2 ['breanna']
3 []

df3: 
1 ['anna']
3 ['rob', 'jerry']
4 []

Я хочу объединить их все в:

df_union: 
1 ['jack', 'anna']
2 ['breanna']
3 ['alice','rob','jerry']
4 ['bob']

Это udf, который я сделал, чтобы помочь:

def appendReasonUdf =
udf((names: Seq[String], newNames: Seq[String]) => names ++ newNames)

Не уверен, каков следующий лучший курс действий.

df1.union(df2) * insert code to special handle the names col ??? *

1 Ответ

1 голос
/ 10 октября 2019

По сути, нам нужно разбить «имена», объединить разбитые таблицы, а затем сгруппировать по столбцу «id», собирая имена в списке. Вот и мы:

scala> :pa
// Entering paste mode (ctrl-D to finish)

import org.apache.spark.sql.DataFrame
val df1 = Seq((1, Nil), (3, List("alice")), (4, List("bob"))).toDF("id", "names")
val df2 = Seq((1, List("jack")), (2, List("breanna")), (3, Nil)).toDF("id", "names")
val df3 = Seq((1, List("anna")), (3, List("rob", "jerry")), (4, Nil)).toDF("id", "names")

def expl(df: DataFrame) = df.select($"id", explode($"names").as("name"))

val dfUnion = expl(df1).union(expl(df2)).union(expl(df3))
dfUnion.groupBy("id").agg(collect_list($"name").as("names")).select("id", "names").orderBy("id").show


// Exiting paste mode, now interpreting.

+---+-------------------+
| id|              names|
+---+-------------------+
|  1|       [jack, anna]|
|  2|          [breanna]|
|  3|[alice, rob, jerry]|
|  4|              [bob]|
+---+-------------------+
...