我有一个包含以下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|
+----------+----+---------+
+----------+----+---------+
对于
unique_data["timestamp"]
,如果您想获取整个列,spark不知道您在谈论哪一行。您可以执行以下操作:duplicate_data = joined_data.filter((joined_data.timestamp != unique_data.collect()[0]['timestamp']))
上面写着加入_数据.时间戳不等于唯一\u数据的第一行,[行0][时间戳]。或者您可以遍历每一行唯一的数据,并检查它们是否相等。你知道吗我们应该在过滤条件中使用别名,因为帧具有相似的列
相关问题 更多 >
编程相关推荐