Apache Spark объединяет несколько строк в список в одной строке - PullRequest
0 голосов
/ 17 марта 2020

Мне нужно создать таблицу (фрейм данных таблицы кустов / искры) из исходной таблицы, которая хранит данные пользователей в N строках в виде списка в одной строке.

User table:
Schema:  userid: string | transactiondate:string | charges: string
----|------------|-------| 
123 | 2017-09-01 | 20.00 | 
124 | 2017-09-01 | 30.00 | 
125 | 2017-09-01 | 20.00 | 
126 | 2017-09-01 | 30.00 | 
456 | 2017-09-01 | 20.00 | 
457 | 2017-09-01 | 30.00 | 
458 | 2017-09-01 | 20.00 | 
459 | 2017-09-01 | 30.00 | 

Выходная таблица должна быть

User table:
Schema:  userid: string | transactiondate:string | charges: string 
------------------|-----------------------------------------------|-------------------------
[123,124,125,126] | [2017-09-01,2017-09-01,2017-09-01,2017-09-01] | [20.00,30.00,20.00,30.00]
[456,457,458,459] | [2017-09-01,2017-09-01,2017-09-01,2017-09-01] | [20.00,30.00,20.00,30.00]

1 Ответ

1 голос
/ 17 марта 2020

Вам необходимо создать значение ключа для группировки данных. Я сделал столбец id и groupBy этот столбец.

import org.apache.spark.sql.expressions.Window

val N = 4
val agg_list = df.columns.map(c => collect_list(c).as(c))
val w = Window.orderBy("transactiondate", "userid")

df.withColumn("id", ((row_number.over(w) - 1) / N).cast("int"))
  .groupBy("id")
  .agg(agg_list.head, agg_list.tail: _*)
  .drop("id").show(false)

Результат:

+--------------------+------------------------------------------------------------------------------------+------------------------+
|userid              |transactiondate                                                                     |charges                 |
+--------------------+------------------------------------------------------------------------------------+------------------------+
|[123, 124, 125, 126]|[2017-09-01 00:00:00, 2017-09-01 00:00:00, 2017-09-01 00:00:00, 2017-09-01 00:00:00]|[20.0, 30.0, 20.0, 30.0]|
|[456, 457, 458, 459]|[2017-09-01 00:00:00, 2017-09-01 00:00:00, 2017-09-01 00:00:00, 2017-09-01 00:00:00]|[20.0, 30.0, 20.0, 30.0]|
+--------------------+------------------------------------------------------------------------------------+------------------------+
...