pyspark 如何在spark中删除一个框架中的重复条目?

nhhxz33t  于 2023-10-15  发布在  Spark
关注(0)|答案(2)|浏览(141)

下面是我的表格。

|    Path    | Name | Value 1 | Value 2 |  E-mail  |
|:----------:|:----:|:-------:|:-------:|:--------:|
| /project/a | a    |  10000  |  8555   | [email protected]|
| /project/b | b    |  4000   |  7549   | [email protected]|
| /project/c | c    |  4571   |  4478   | [email protected]|
| /project/a | a    | -1.0    |  0.0    | [email protected]|

架构:
路径-字符串
Name - String
值1 -浮动
值2 -浮点
电子邮件字符串
现在,我想在将报告发送给电子邮件列中的相关人员时,完全过滤掉最后一个重复的姓名行(a再次重复)。
我试过使用条件语句(if语句),但它不起作用。我该怎么办?

if (project["Name"] == 'a' and project["Value 1"] == '-1.0'):
    continue
else:
    mail_notification(sender,receiver,subject)
wh6knrhe

wh6knrhe1#

如果你想从一个基于列(或一组列)的嵌套框架中删除重复项,你可以使用dropDuplicates。请注意,它可能不会删除第二个,排序不是确定性的,当其余字段相同或不相关时应该使用这一点。例如:

deduplicated = df.dropDuplicates(['Name'])

如果您希望为重复数据删除首选项排序,则可以使用窗口函数(row_numberWindow)。例如,在重复组中选择最高“值1”的行:

import pyspark.sql.functions as f
from pyspark.sql import Window

window = Window().partitionBy('Name').orderBy(f.desc('Value 1'))
deduplicated = df.withColumn('row_number', f.row_number().over(window))\
    .filter(f.col('row_number') == 1)\
    .drop('row_number')

如果你只是想删除负值,因为它们不是有效数据,最简单的方法是过滤:

import pyspark.sql.functions as f
filtered = df.filter(f.col('Value 1') >= 0)
nwlqm0z1

nwlqm0z12#

尝试低于1-
1.创建框架
1.迭代for循环-

for i in df.collect():
    if ((i["Name"] == 'a') & (i["Value 1"] == -1.0)):
        continue
    else:
        mail_notification(sender,receiver,subject)

相关问题