Python 加入的数据帧上的筛选器在pyspark中不起作用
我有一个包含以下三列的数据框架Python 加入的数据帧上的筛选器在pyspark中不起作用,python,apache-spark,pyspark,Python,Apache Spark,Pyspark,我有一个包含以下三列的数据框架 学生证 名字 时间戳 一个学生id有多行,其中包含不同的名称以及记录实际更新的时间戳。我想得到两个不同的数据帧 唯一_数据(所有学生id的行以及该学生id的最新时间戳) 重复的_数据(输入数据框中的所有行,上述唯一的_数据行除外) 我有以下生成2个数据帧的代码 input_frame.show() +----------+----------+---------+ |student_id|name |timestamp| +----------+
- 学生证
- 名字
- 时间戳
- 唯一_数据(所有学生id的行以及该学生id的最新时间戳)
- 重复的_数据(输入数据框中的所有行,上述唯一的_数据行除外)
input_frame.show()
+----------+----------+---------+
|student_id|name |timestamp|
+----------+----------+---------+
| s1|testuser | t1|
| s1|sampleuser| t2|
| s2|test123 | t1|
| s2|sample123 | t2|
+----------+----------+---------+
# Assuming t2 > t1
unique_data = input_frame.sort(sf.desc(timestamp))drop_duplicates("student_id")
unique_data.show()
+----------+----------+---------+
|student_id|name |timestamp|
+----------+----------+---------+
| s1|sampleuser| t2|
| s2|sample123 | t2|
+----------+----------+---------+
input_frame = input_frame.alias('input_frame')
unique_frame = unique_frame.alias('unique_frame')
joined_data = input_frame.join(unique_data, input_frame["student_id"] == unique_data["student_id"], how="left")
joined_data.show()
+----------+----------+---------+----------+----------+---------+
|student_id|name |timestamp|student_id|name |timestamp|
+----------+----------+---------+----------+----------+---------+
| s1|testuser | t1| s1|sampleuser| t2|
| s1|sampleuser| t2| s1|sampleuser| t2|
| s2|test123 | t1| s2|sample123 | t2|
| s2|sample123 | t2| s2|sample123 | t2|
+----------+----------+---------+----------+----------+---------+
duplicate_data = joined_data.filter(input_frame["timestamp"] != unique_data["timestamp"]).select("input_frame.*")
duplicate_data.show()
+----------+----+---------+
|student_id|name|timestamp|
+----------+----+---------+
+----------+----+---------+
对于unique_data[“timestamp”]
,如果您想获取整个列,spark不知道您在谈论哪一行。您可以执行以下操作:
duplicate_data=joined_data.filter((joined_data.timestamp!=unique_data.collect()[0]['timestamp']))
表示joined_data.timestamp不等于唯一_数据的第一行[row 0][timestamp]。或者,您可以遍历每一行唯一的_数据,并检查它们是否相等。我们应该在筛选条件中使用别名,因为帧具有类似的列
from pyspark.sql import functions as sf
input_frame = input_frame.alias('input_frame')
unique_frame = unique_frame.alias('unique_frame')
duplicate_data = joined_data.filter(sf.col("input_frame.timestamp") != sf.col("unique_data.timestamp")).select("input_frame.*")
duplicate_data.show()
+----------+----------+---------+
|student_id|name |timestamp|
+----------+----------+---------+
| s1|testuser | t1|
| s2|test123 | t1|
+----------+----------+---------+