[英]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.