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

时间:2017-12-19 17:49:26

标签: python apache-spark spark-dataframe pyspark-sql

数据只是一组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。

2 个答案:

答案 0 :(得分:-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)

答案 1 :(得分:-2)

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

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