簡體   English   中英

過濾器加入 dataframe 在 pyspark 中不起作用

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

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM