SparkSQL scala api взорваться с именами столбцов - PullRequest
0 голосов
/ 23 мая 2019

У меня есть DataFrame в spark, который выглядит следующим образом:

+------+-----+-----+-----+
| name | id1 | id2 | id3 |
+------+-----+-----+-----+
|  Bob |   1 |  10 | 100 |
| Jill |   2 |  20 | 200 |
|  Sue |   3 |  30 | 300 |
| Lane |   4 |  40 | 400 |
+------+-----+-----+-----+

Я хочу отсортировать explode столбцы идентификаторов, например:

+------+----------+---------+
| name | id_value | id_type |
+------+----------+---------+
|  Bob |        1 |     id1 |
|  Bob |       10 |     id2 |
|  Bob |      100 |     id3 |
| Jill |        2 |     id1 |
| Jill |       20 |     id2 |
| Jill |      200 |     id3 |
|  Sue |        3 |     id1 |
|  Sue |       30 |     id2 |
|  Sue |      300 |     id3 |
| Lane |        4 |     id1 |
| Lane |       40 |     id2 |
| Lane |      400 |     id3 |
+------+----------+---------+

Я используюскала апи.Есть ли хороший способ сделать это?Я посмотрел на функции explode и arrays_zip, но не совсем уверен, что это лает на правильное дерево.

Ответы [ 2 ]

1 голос
/ 23 мая 2019

Разнесение предназначено для массивов и карт, но для структурированных типов можно использовать union:

df.columns
  .collect {
    case column if column.startsWith("id") =>
      df.select($"name",
                col(column) as "id_value",
                lit(column) as "id_type")
  }
  .reduce(_ union _)
  .show()

Вывод:

+----+--------+-------+
|name|id_value|id_type|
+----+--------+-------+
| Bob|       1|    id1|
|Jill|       2|    id1|
| Sue|       3|    id1|
|Lane|       4|    id1|
| Bob|      10|    id2|
|Jill|      20|    id2|
| Sue|      30|    id2|
|Lane|      40|    id2|
| Bob|     100|    id3|
|Jill|     200|    id3|
| Sue|     300|    id3|
|Lane|     400|    id3|
+----+--------+-------+
0 голосов
/ 23 мая 2019

Другим, возможно, менее элегантным решением может быть использование explode в сочетании с lateral view:

select name, id[0] as id_value, id[1] as id_type
from ds
lateral view explode(array(array(id1, 'id1'), array(id2, 'id2'), array(id3, 'id3'))) ids as id

+----+--------+-------+
|name|id_value|id_type|
+----+--------+-------+
| Bob|       1|    id1|
| Bob|      10|    id2|
| Bob|     100|    id3|
|Jill|       2|    id1|
|Jill|      20|    id2|
|Jill|     200|    id3|
| Sue|       3|    id1|
| Sue|      30|    id2|
| Sue|     300|    id3|
|Lane|       4|    id1|
|Lane|      40|    id2|
|Lane|     400|    id3|
+----+--------+-------+
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...