Как создать кумулятивную конкатенацию в Spark SQL

#scala #apache-spark #apache-spark-sql

Вопрос:

Мой вклад в spark приведен ниже:

Col_1 Col_2 Сумма
1 0 35/310320
1 1 35/5
1 1 180/-310350
17 1 0/1000
17 17 0/-1000
17 17 74/314322
17 17 74/5
17 17 185/-3142

Я хочу сгенерировать следующие выходные данные с помощью spark SQL:

Выход
35/310320
35/310320/35/5
35/310320/35/5/180/-310350
0/1000
0/1000/0/-1000
0/1000/0/-1000/74/314322
0/1000/0/-1000/74/314322/74/5
0/1000/0/-1000/74/314322/74/5/185/-3142

Условия и процедура: Если col_1 col_2 значения и не совпадают, рассмотрите текущее значение суммы для нового выходного столбца, но оба они одинаковы, а затем объедините предыдущее значение всей суммы / .

т. е. 17, col_1 где col_1 amp; col_2 значение отличается, поэтому учитывайте текущую сумму 0/1000 . Следующий шаг значения обоих столбцов одинаковы, поэтому значение равно 0/1000/0/-1000 и так далее. Необходимо создать эту логику для динамических данных в spark SQL или Spark Scala.

Ответ №1:

Вы можете использовать concat_ws в списке сумму, полученную из collect_list соответствующего окна:

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

val df2 = df.withColumn(
    "output", 
    concat_ws(
        "/", 
        collect_list("amount").over(
            Window.partitionBy("col_1")
                  .orderBy("col_2")
                  .rowsBetween(Window.unboundedPreceding, 0)
        )
    )
)