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")))
使用新示例进行编辑以阐明
以下数据
+------+---------+-----------+
| 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")))