是否支持窗口函数(例如first, last, lag, lead
)pyspark
?
例如,如何按一列分组并按另一列排序,然后通过 SparkSQL 或数据框为每个组选择第一行(就像窗口函数一样)?
我发现pyspark.sql.functions
类包含聚合函数first
和last
,但它们不能用于groupBy
类。
是否支持窗口函数(例如first, last, lag, lead
)pyspark
?
例如,如何按一列分组并按另一列排序,然后通过 SparkSQL 或数据框为每个组选择第一行(就像窗口函数一样)?
我发现pyspark.sql.functions
类包含聚合函数first
和last
,但它们不能用于groupBy
类。
上述所有函数都可以与 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 用于滞后/领先类型的功能。它们主要与rank / percent_rank / row_number类型函数结合使用。
从 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()