连接的数据帧上的筛选器在pysp中不起作用

2024-09-25 16:34:16 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个包含以下3列的数据帧

  • 学号
  • 姓名
  • 时间戳

一个学生id有多行,名称不同,记录实际更新的时间戳也不同。我想得到两个不同的数据帧。你知道吗

  • 唯一的\u数据(所有学生id的行以及该学生id的最新时间戳)

  • 重复的\u数据(除上述唯一的\u数据行外,输入数据帧中的所有行)

我有以下生成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|
+----------+----+---------+
+----------+----+---------+

Tags: 数据nameidinputdataframestudenttimestamp
2条回答

对于unique_data["timestamp"],如果您想获取整个列,spark不知道您在谈论哪一行。您可以执行以下操作:

duplicate_data = joined_data.filter((joined_data.timestamp != unique_data.collect()[0]['timestamp'])) 上面写着加入_数据.时间戳不等于唯一\u数据的第一行,[行0][时间戳]。或者您可以遍历每一行唯一的数据,并检查它们是否相等。你知道吗

我们应该在过滤条件中使用别名,因为帧具有相似的列

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|
+     +     +    -+

相关问题 更多 >