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