Соединить два столбца массива в последовательности - scala - PullRequest
0 голосов
/ 06 апреля 2020

У меня есть фрейм данных с двумя столбцами Array, пытающийся создать новый столбец путем последовательного соединения A и B.

val df = Seq((Seq("a","b","c"),Seq("d","5","6"))).toDF("A","B")

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

C: ["ad", "b 5", "c 6"]

Я изучаю оба массивов и присоедините его снова, используя функцию «import org. apache .spark. sql .functions.array», но она не дает ожидаемого результата.

Ответы [ 2 ]

2 голосов
/ 06 апреля 2020

Получил ожидаемый результат, используя функцию arrays_zip, как показано ниже:

import org.apache.spark.sql.functions.arrays_zip
val output = df.withColumn(
 "zipped", arrays_zip($"A", $"B")
)
0 голосов
/ 06 апреля 2020

Я думаю, что у Spark нет функции для этого. Вы можете использовать пользовательскую функцию здесь zip, например:

import spark.implicits._
def zipFunc: (Seq[String], Seq[String]) => Seq[String] = (x: Seq[String], y: Seq[String]) => 
  x.zip(y).map{ case (xi, yi) => s"$xi $yi"}

val df = Seq(
  (Seq("a","b","c"), Seq("d","5","6"))
).toDF("A","B")
df.printSchema()
val zipUDF = spark.udf.register("zipUdf", zipFunc)
df.withColumn("C", zipUDF($"A", $"B")).show()

печать:

+---------+---------+---------------+
|        A|        B|              C|
+---------+---------+---------------+
|[a, b, c]|[d, 5, 6]|[a d, b 5, c 6]|
+---------+---------+---------------+
...