генерировать 2 строки для каждой строки в искре, используя оптимизированный DSL - PullRequest
0 голосов
/ 20 сентября 2019

У меня есть такие данные, как:

id,ts_start,ts_end,foo_start,foo_end
1,1,2,f_s,f_e
2,3,4,foo,bar
3,3,6,foo,f_e

Т.е. одна запись со всей начальной и конечной информацией.Используя плоскую карту, их можно преобразовать в

id,ts,foo
1,1,f_s
1,2,f_e

Как я могу сделать то же самое, используя оптимизированный SQL DSL с explode или, возможно, pivot?

edit

Очевидно, я не хочу читать данные два раза и объединять результат.

Или это единственный вариант, если я не хочу использовать flatmap + serde + custom code?

1 Ответ

2 голосов
/ 20 сентября 2019

дано:

val df = Seq(
  (1,1,2,"f_s","f_e"),
  (2,3,4,"foo","bar"),
  (3,3,6,"foo","f_e")
).toDF("id","ts_start","ts_end","foo_start","foo_end")

Вы можете сделать:

df
  .select($"id",
    explode(
      array(
       struct($"ts_start".as("ts"),$"foo_start".as("foo")),
       struct($"ts_end".as("ts"),$"foo_end".as("foo"))
     )
    ).as("tmp")
  )
  .select(
    $"id",
    $"tmp.*"
  )
  .show()

, что дает:

+---+---+---+
| id| ts|foo|
+---+---+---+
|  1|  1|f_s|
|  1|  2|f_e|
|  2|  3|foo|
|  2|  4|bar|
|  3|  3|foo|
|  3|  6|f_e|
+---+---+---+
...