Как групповые и оконные функции взаимодействуют в Spark SQL? - PullRequest
0 голосов
/ 13 апреля 2020

Из этого вопроса я узнал, что оконные функции оцениваются после группировки по функции в PostgresSQL.

Я хотел бы знать, что происходит, когда вы используете функцию group by и window в одном запросе в Spark. У меня те же вопросы, что и у постера из предыдущего вопроса:

  • Сгруппированы ли сначала выбранные строки, а затем рассматриваются оконной функцией?
  • Или оконная функция выполняется первой, затем полученные значения сгруппированы по группе?
  • Что-то еще?

1 Ответ

1 голос
/ 13 апреля 2020

Если у вас есть окно и , сгруппированные по в том же запросе, тогда

  • Группировка по выполнению first затем функция window будет применена к набору групповых данных.

  • Для более подробной информации вы можете проверить план объяснения запроса.

Example:

//sample data
spark.sql("select * from tmp").show()
//+-------+----+
//|trip_id|name|
//+-------+----+
//|      1|   a|
//|      2|   b|
//+-------+----+


spark.sql("select row_number() over(order by trip_id),trip_id,count(*) cnt from tmp group by trip_id").explain()
//== Physical Plan ==
//*(4) Project [row_number() OVER (ORDER BY trip_id ASC NULLS FIRST ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW)#150, trip_id#10, cnt#140L]
//+- Window [row_number() windowspecdefinition(trip_id#10 ASC NULLS FIRST, specifiedwindowframe(RowFrame, unboundedpreceding$(), currentrow$())) AS row_number() OVER (ORDER BY //trip_id ASC NULLS FIRST ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW)#150], [trip_id#10 ASC NULLS FIRST]
//   +- *(3) Sort [trip_id#10 ASC NULLS FIRST], false, 0
//      +- Exchange SinglePartition
//         +- *(2) HashAggregate(keys=[trip_id#10], functions=[count(1)])
//            +- Exchange hashpartitioning(trip_id#10, 200)
//               +- *(1) HashAggregate(keys=[trip_id#10], functions=[partial_count(1)])
//                  +- LocalTableScan [trip_id#10]

*(2) groupby executed first

*(4) window function applied on the result of grouped dataset.

В случае, если у вас есть предложение окна subquery и внешний запрос имеет группу, к которой затем подзапрос (окно) выполняется первым, а затем внешний запрос (groupBy).

Ex: spark.sql("select trip_id,count(*) from(select *,row_number() over(order by trip_id)rn from tmp)e group by trip_id ").explain()

...