pyspark是否支持窗口功能(例如,first,last,lag,lead)?

时间:2015-03-23 21:26:13

标签: apache-spark pyspark

first, last, lag, lead是否支持窗口功能(例如pyspark)?

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

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

2 个答案:

答案 0 :(得分:1)

自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()

答案 1 :(得分:0)

所有上述功能都可以在Window功能中使用。样本看起来有点像这样。

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

仅当您使用 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'))
    )
)

虽然严格来说,你不需要desc用于lag / lead类型的功能。它们主要与 rank / percent_rank / row_number 类型函数一起使用。