[英]Filter on joined dataframe is not working in pyspark
我有一个 dataframe 与以下 3 列
具有不同名称的学生 ID 有多行以及记录实际更新的时间戳。 我想获得 2 个不同的数据框。
unique_data(所有学生ID的行,该学生ID的最新时间戳)
duplicate_data(来自输入 dataframe 的所有行,除了上面提到的 unique_data 行)
我有以下代码生成 2 个数据帧
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|
+----------+----+---------+
+----------+----+---------+
我们应该在过滤条件中使用别名,因为帧具有相似的列
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|
+----------+----------+---------+
对于unique_data["timestamp"]
,如果你想取整列,spark 不知道你在说哪一行。 您可以执行以下操作:
duplicate_data = joined_data.filter((joined_data.timestamp.= unique_data.collect()[0]['timestamp']))
表示joined_data.timestamp不等于unique_data的第一行,[row 0][timestamp]。 或者您可以遍历 unique_data 的每一行并检查它们是否相等。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.