繁体   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