#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)
)
)
)