Apache spark pyspark是否支持窗口功能(如第一、最后、滞后、领先)?

Apache spark pyspark是否支持窗口功能(如第一、最后、滞后、领先)?,apache-spark,pyspark,Apache Spark,Pyspark,pyspark是否支持窗口功能(例如first、last、lag、lead) 例如,如何按一列分组并按另一列排序,然后选择 每组的第一行(与窗口函数类似 是否使用SparkSQL或数据帧 我发现pyspark.sql.functions类包含聚合函数first和last,但它们不能用于groupBy类 由于spark 1.4,您可以使用窗口功能。在pyspark中,这看起来像这样: 从pyspark.sql.functions导入秩 从pyspark.sql导入窗口 data=sqlContex

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

例如,如何按一列分组并按另一列排序,然后选择 每组的第一行(与窗口函数类似 是否使用SparkSQL或数据帧


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

由于spark 1.4,您可以使用窗口功能。在pyspark中,这看起来像这样:

从pyspark.sql.functions导入秩
从pyspark.sql导入窗口
data=sqlContext.read.parquet(“/some/data/set”)
data_with_rank=data.withColumn(“rank”,rank().over(Window.partitionBy(“col1”).orderBy(data[“col2”].desc()))
带秩的数据\u.filter(带秩[“秩”]=1.show()的数据\u)

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

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不要使用pationby子句。然而,这并不是很有效

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

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。它们主要与等级/百分比/等级/行数类型函数结合使用。

我认为它们不受直接支持,但您可以自己实现它们;groupByKey为您提供一个数组(好的,是一个iterable),其中包含一个组中的所有“行”(对象),该组作为配置单元UDF(用户定义函数)实现,应该在Spark SQL中工作。您需要使用配置单元构建Spark,更改一些配置,并注册UDF。请注意,如果要在窗口操作中使用
df.sql
功能,则需要使用
HiveContext
,而不是
SqlContext