first, last, lag, lead
是否支持窗口功能(例如pyspark
)?
例如,如何按一列分组并按另一列排序,然后选择 每组的第一行(就像窗口函数一样) 做)由SparkSQL或数据框?
我发现pyspark.sql.functions
类包含聚合函数first
和last
,但它们不能用于groupBy
类。
答案 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 类型函数一起使用。