Pyspark Dataframe :如果同一主键有两个重复的行,如何随机删除一行?Databricks

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

我正在使用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 |意大利|
我该怎么写剧本?
谢谢.

ioekq8ef

ioekq8ef1#

你可以简单地使用dropDuplicates()id作为子集列。
参见下面的示例

# given the following input
# +---+---+---+---+
# | id| c1| c2| c3|
# +---+---+---+---+
# |  1|foo|bar|baz|
# |  1|foo|baz|bar|
# |  2|foo|bar|baz|
# |  2|foo|bar|baz|
# +---+---+---+---+

data_sdf. \
    dropDuplicates(subset=['id']). \
    show()

# +---+---+---+---+
# | id| c1| c2| c3|
# +---+---+---+---+
# |  1|foo|bar|baz|
# |  2|foo|bar|baz|
# +---+---+---+---+
fjnneemd

fjnneemd2#

删除重复记录的一种方法是为每个id组向对象框架添加一个行号列,然后只保留每个组的第一行。

验证码:

from pyspark.sql.types import StructType, StructField, IntegerType, StringType
# Define the schema for the dataframe
schema = StructType([
    StructField("id", IntegerType(), True),
    StructField("Name", StringType(), True),
    StructField("Age", IntegerType(), True),
    StructField("Country", StringType(), True)
])

# Create the dataframe
data = [
    (1, "Mike", 18, "USA"),
    (2, "Lily", 25, "Japan"),
    (2, "Lily", 22, "Japan"),
    (3, "John", 23, "China"),
    (4, "Snow", 36, "Korea"),
    (5, "Tom", 28, "Austria"),
    (5, "Cindy", 28, "Italy")
]

df = spark.createDataFrame(data, schema)

# Show the dataframe
df.show()

from pyspark.sql.window import Window
from pyspark.sql.functions import row_number
# Define a window function to partition by id and order by any column
window = Window.partitionBy("id").orderBy("Name")

# Add a row number column to the dataframe
df = df.withColumn("row_number", row_number().over(window))

# Keep only the first row for each id
df = df.filter(df.row_number == 1).drop("row_number")

# Show the resulting dataframe
df.show()
  • 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 |意大利|

相关问题