Как разбить одну строку на несколько строк в Spark DataFrame с помощью Java - PullRequest
0 голосов
/ 21 октября 2018

У меня есть таблица, как показано:

Table 1


Я хочу преобразовать ее в следующую таблицу, используя Spark Java или Spark Scala

Transformed Table 1

Ответы [ 3 ]

0 голосов
/ 21 октября 2018

убедитесь, что у вас есть уникальные имена столбцов, denn вы можете сделать:

import or.apache.spark.sql.functions._

table
  .select("id","movie",explode(array("cast1", "cast2", "cast3", "cast4")).as("cast"))
  .where(col("cast").isNotNull)
0 голосов
/ 22 октября 2018

С "union":

val table = List(
  (101, "ABC", "A", "B", "C", "D"),
  (102, "XZY", "G", "J", null, null))
  .toDF("ID", "Movie", "Cast1", "Cast2", "Cast3", "Cast4")

val columnsToUnion = List("Cast1", "Cast2", "Cast3", "Cast4")
val result = columnsToUnion.map(name => table.select($"ID", $"Movie", col(name).alias("Cast")).where(col(name).isNotNull))
  .reduce(_ union _)
result.show(false)

Вывод:

+---+-----+----+
|ID |Movie|Cast|
+---+-----+----+
|101|ABC  |A   |
|102|XZY  |G   |
|101|ABC  |B   |
|102|XZY  |J   |
|101|ABC  |C   |
|101|ABC  |D   |
+---+-----+----+

ПРИМЕЧАНИЕ: Таблица не может иметь несколько столбцов с одинаковыми именами, при условии, что имена столбцов имеюттакой шаблон: "Cast [i]"

0 голосов
/ 21 октября 2018
table.groupBy("ID", "Movie")
  .agg(collect_list("Cast1", "Cast2", "Cast3", "Cast2").as("cast"))
  .withColumn("cast", explode("cast"))

// примечание: всегда следует избегать дублирования имени столбца в одном и том же кадре данных

...