我正在使用Azure databricks,pyspark现在有一个现有的框架,如下所示
df:
| ID|名称|年龄|国家|
| --|--|--|--|
| 1 |迈克| 18 |美国|
| 2 |莉莉| 25 |日本|
| 2 |莉莉| 22 |日本|
| 3 |约翰| 23 |中国|
| 4 |雪| 36 |韩国|
| 5 |汤姆| 28 |奥地利|
| 5 |辛迪| 28 |意大利|
列“id”是主键,不能有重复的值,这意味着所有的数字应该只出现一次,但现在正如你所看到的,数字2和5有两行不同的值。我只需要为id 2保留一行,为id 5保留一行。我们可以随机删除并保留另一行,或者如果有重复的行,我们可以只保留上面的一行
我需要具备以下条件:
| ID|名称|年龄|国家|
| --|--|--|--|
| 1 |迈克| 18 |美国|
| 2 |莉莉| 25 |日本|
| 3 |约翰| 23 |中国|
| 4 |雪| 36 |韩国|
| 5 |汤姆| 28 |奥地利|
或者下面也可以:
| ID|名称|年龄|国家|
| --|--|--|--|
| 1 |迈克| 18 |美国|
| 2 |莉莉| 22 |日本|
| 3 |约翰| 23 |中国|
| 4 |雪| 36 |韩国|
| 5 |辛迪| 28 |意大利|
我该怎么写剧本?
谢谢.
2条答案
按热度按时间ioekq8ef1#
你可以简单地使用
dropDuplicates()
和id
作为子集列。参见下面的示例
fjnneemd2#
删除重复记录的一种方法是为每个
id
组向对象框架添加一个行号列,然后只保留每个组的第一行。验证码:
Window.partitionBy("id").orderBy("Name")
:这定义了一个窗口函数,该函数按id
列划分子帧,并按Name
列对每个分区中的行进行排序。df.withColumn("row_number", row_number().over(window))
:这将向子框架添加一个名为row_number
的新列,其中包含窗口函数定义的每个分区的行号。df.filter(df.row_number == 1).drop("row_number")
:这将过滤嵌套框,只保留row_number
列等于1的行,这对应于每个分区中的第一行。然后,它从生成的嵌套框架中删除row_number
列。输出:
| ID|名称|年龄|国家|
| --|--|--|--|
| 1 |迈克| 18 |美国|
| 2 |莉莉| 25 |日本|
| 3 |约翰| 23 |中国|
| 4 |雪| 36 |韩国|
| 5 |辛迪| 28 |意大利|