pyspark 支持窗口函数(例如第一个、最后一个、滞后、领先)吗?

Jie*_*hen 7 apache-spark pyspark

first, last, lag, lead是否支持窗口函数(例如) pyspark

例如,如何按一列进行分组并按另一列进行排序,然后通过 SparkSQL 或数据框选择每个组的第一行(这就像窗口函数所做的那样)?

我发现pyspark.sql.functions类包含聚合函数firstlast,但它们不能用于groupBy类。

小智 7

上述所有函数都可以与窗口函数一起使用。样本看起来有点像这样。

from pyspark.sql.window import Window
from pyspark.sql.functions import lag, lead, first, last

df.withColumn('value', lag('col1name').over(
    Window.partitionBy('colname2').orderBy('colname3')
    )
)
Run Code Online (Sandbox Code Playgroud)

仅当使用partitionBy 子句时,该函数才用于分区。如果您只想滞后/领先整个数据,请使用简单的orderBy并且不要使用 patitionBy子句。然而,这不会非常有效。

如果您希望滞后/超前以相反的方式执行,您还可以使用以下格式:

from pyspark.sql.window import Window
from pyspark.sql.functions import lag, lead, first, last, desc

df.withColumn('value', lag('col1name').over(
    Window.partitionBy('colname2').orderBy(desc('colname3'))
    )
)
Run Code Online (Sandbox Code Playgroud)

尽管严格来说,您不需要滞后/超前类型函数的 desc。它们主要与rank/percent_rank/row_number类型函数结合使用。


小智 3

从 Spark 1.4 开始,您可以使用窗口函数。在 pyspark 中,这看起来像这样:

from pyspark.sql.functions import rank
from pyspark.sql import Window
data = sqlContext.read.parquet("/some/data/set")
data_with_rank = data.withColumn("rank", rank().over(Window.partitionBy("col1").orderBy(data["col2"].desc())))
data_with_rank.filter(data_with_rank["rank"] == 1).show()
Run Code Online (Sandbox Code Playgroud)