获取分组PySpark数据框的第一行(或最后一行)[重复]

问题描述 投票:2回答:2

这个问题在这里已有答案:

这些数据只是一组ID,它们的登录日期如下:

data = pd.DataFrame({'id': ['a', 'b', 'c', 'b', 'c'], 
                   'date': ['2017/12/10', '2017/12/10', '2017/12/11', '2017/12/12', '2017/12/12']})

id | date
---------------
 a | 2017/12/10
 b | 2017/12/10
 c | 2017/12/11
 b | 2017/12/12
 c | 2017/12/12

每个id可能有多个记录。对于Pandas,如果我只想单独输出每个id的最新记录,我会这样做:

most_recent = data.sort_values('date', ascending=False).groupby('id').head(1)

如何使用PySpark Dataframe实现相同的功能?

我尝试过这样的事情:

data.orderBy(data.date, ascending=False).groupBy('id')

但是因为在此之后我不需要使用任何聚合函数,所以我被卡住了。

我意识到我可以将PySpark数据帧转换为Pandas数据帧,但我想知道如何使用PySpark。

python apache-spark spark-dataframe pyspark-sql
2个回答
-1
投票

您可以通过分组,对分组数据进行排序,然后拉出第一个数据来实现。例如:

from pyspark.sql.functions import collect_list, sort_array

data = [
    ("a", "2017/12/10"),
    ("b", "2017/12/10"),
    ("c", "2017/12/11"),
    ("b", "2017/12/12"),
    ("c", "2017/12/12")
]
df = sqlContext.createDataFrame(sc.parallelize(data), ["id", "date"])

grouped = df.groupBy("id").agg(collect_list("date").alias("dates"))
sorted = grouped.withColumn("dates", sort_array("dates", asc=False))
most_recent = sorted.selectExpr("id", "dates[0]")

most_recent.show(10, False)

-2
投票
newdf=data.orderBy(data.date, ascending=False).groupBy('id').count()
newdf.rdd.map(lambda x: x[0]).collect()

通过这种方式,您可以轻松返回DataFrame。

© www.soinside.com 2019 - 2024. All rights reserved.