pyspark dataframe 检索有序列中每个序列中的第一个值

pyspark dataframe retrieve the first value in each sequence within an ordered column

使用新示例进行编辑以阐明

以下数据

+------+---------+-----------+
|    ID| location| loggedTime|
+------+---------+-----------+
|    67|      312|   12:09:00|    
|    67|      375|   12:23:00|     
|    67|      375|   12:25:00|     
|    67|      650|   12:26:00|     
|    75|      650|   12:27:00|     
|    75|      650|   12:29:00|     
|    75|      800|   12:30:00|     
+------+---------+-----------+

应该产生下面的结果,我们将每一行与前一列 'ID' 和 'location' 进行比较。每次在不同位置记录 ID 时,我都需要记录。他们可以稍后在序列中再次访问同一位置,因此不可能删除 ID 和位置上的重复项


+------+---------+-----------+
|    ID| location| loggedTime|
+------+---------+-----------+
|    67|      312|   12:09:00|    
|    67|      375|   12:23:00|     
|    67|      650|   12:26:00|     
|    75|      650|   12:27:00|     
|    75|      800|   12:30:00|     
+------+---------+-----------+

使用由 loggedTime 排序的 Window 可用于从上一行获取 location。那么可以过滤掉当前和上一个location相同的行:

from pyspark.sql import functions as F
from pyspark.sql import Window

w=Window.partitionBy("ID").orderBy("loggedTime")
df.withColumn("prev_location", F.lag("location").over(w)) \
  .filter("prev_location is null or location <> prev_location") \
  .drop("prev_location") \
  .show()

输出:

+---+--------+-------------------+
| ID|location|         loggedTime|
+---+--------+-------------------+
| 67|     312|1970-01-01 00:09:00|
| 67|     375|1970-01-01 00:23:00|
| 67|     650|1970-01-01 00:26:00|
| 75|     650|1970-01-01 00:27:00|
| 75|     800|1970-01-01 00:30:00|
+---+--------+-------------------+

使用分组依据怎么样?

df = df.groupBy(col("id"), col("location")).agg(min(col("loggedTime")))