Как создать один столбец структуры массива для «нескольких» отдельных столбцов DF / DS с помощью Spark SCALA - PullRequest
0 голосов
/ 31 октября 2018

Скажите, у меня есть два стола, order_table и room_table

order_table

+----------+---------+
| order_id | info    |
+----------+---------+
| order1   | infos   |
+----------+---------+

room_table с множеством столбцов

+----------+---------+-----+
| order_id | room_id | ... | 
+----------+---------+-----+
| order1   | room1   | ... |
| order1   | room2   | ... |
+----------+---------+-----+

Я хочу добавить select * from room_table group by order_id результат в виде списка сбора в order_table новый столбец rooms.

Таблица вывода должна содержать схему:

-order_id string,
-info string,
-room array<struct>
 --room_id string,
 --room_price int,
 --room_name string
 -- ....

1 Ответ

0 голосов
/ 31 октября 2018
    val df1 = Seq(("order_1", "order_1_info"),
              ("order_2", "order_2_info")).toDF("order_id", "info")
    val df2 = Seq(("order_1", "room_1", 100, "palace_1"),
              ("order_2", "room_2", 200, "palace_2"),
              ("order_1", "room_3", 100, "palace_3"),
              ("order_2", "room_8", 200, "palace_x"))
              .toDF("order_id", "room_id", "room_price", "room_name")
    val cols: Array[String] = df2.columns
    val df3 = df2.groupBy("order_id").agg(collect_list(struct(cols.head, cols.tail:_*)) as "room")
    val df4 = df1.join(df3, Seq("order_id"))
    df4.show()
    df4.printSchema()

В приведенном выше фрагменте кода я только что сделал несколько примеров данных для использования.

Выход: -

+--------+------------+--------------------+
|order_id|        info|                room|
+--------+------------+--------------------+
| order_1|order_1_info|[[order_1,room_1,...|
| order_2|order_2_info|[[order_2,room_2,...|
+--------+------------+--------------------+

Схема: -

root
 |-- order_id: string (nullable = true)
 |-- info: string (nullable = true)
 |-- room: array (nullable = true)
 |    |-- element: struct (containsNull = true)
 |    |    |-- order_id: string (nullable = true)
 |    |    |-- room_id: string (nullable = true)
 |    |    |-- room_price: integer (nullable = false)
 |    |    |-- room_name: string (nullable = true)

Надеюсь, это полезно

...