【问题标题】:Remove sub set of rows from the original dataframe using Pyspark使用 Pyspark 从原始数据框中删除子集
【发布时间】:2021-11-25 03:46:18
【问题描述】:

我有如下两个数据框

DF1 - 包含过去 1 个月的数据

root
 |-- id: integer (nullable = true)
 |-- name: string(nullable = true)
 |-- age: string (nullable = true)
 |-- createdDate: long (nullable = false)
 |-- school: string(nullable = true)

DF2 - 包含今天的数据

root
 |-- id: integer (nullable = true)
 |-- name: string(nullable = true)
 |-- age: string (nullable = true)
 |-- createdDate: long (nullable = false)
 |-- school: string(nullable = true)

由于这些数据框包含不同学校学生的详细信息,因此应始终使用 id 和学校列来识别唯一行。我想根据 id 和学校从 DF1 中删除 DF2 中可用的所有学生详细信息。我不确定如何使用 pyspark 来做到这一点。

joined_df = DF1.join(DF2, (DF1.id == DF2.id) & (DF1.school == DF2.school).select('*')
joined_df = joined_df.dropDuplicates()

我写了上面的代码。但后来我意识到这只会删除重复项,它将原始数据集留在 DF1 中。我怎样才能达到我的要求?

【问题讨论】:

    标签: python dataframe apache-spark pyspark


    【解决方案1】:

    更新数据框的经典方法是对其自身应用更改。删除行也是一样的:您需要过滤所需的数据...或排除您不需要的数据。
    关键是识别要删除的行:这要归功于基于学校的连接,该连接将根据 ID 值填充额外的列。左连接将确保您保留来自其他学校的行,我将重命名 df2.id 以使其与 df1.id 不同。
    步骤如下:

    • 为连接准备 df2:保留必要的列,重命名 id
    • 左连接将 id2 列添加到 df1
    • 添加一列,其中包含 id 和 id2 之间的比较结果
    • 过滤 ID 不同的列
    • 删除添加的列以获得结果

    它看起来像这样:

    from pyspark.sql import functions as F
    
    df2_new = df2.select(df2.id.alias("id2"), df2.school)
    
    df1 = df1.join(df2_new, DF1.school == DF2.school, how='left') \
          .withColumn('to_remove', F.when(df1.id == DF1.id2, F.lit(1)).otherwise(F.lit(0)) \
          .filter(df1.to_remove != 1) \
          .drop('id2', 'to_remove')
    

    【讨论】:

    • 我得到 'DataFrame' object has no attribute 'to_remove' 错误
    • 对不起,我的错:我忘记了)。我相应地编辑了帖子,我还添加了一个otherwise() 子句来保护
    猜你喜欢
    • 1970-01-01
    • 2021-01-16
    • 2022-01-23
    • 1970-01-01
    • 1970-01-01
    • 2022-08-14
    • 1970-01-01
    • 2020-09-03
    • 1970-01-01
    相关资源
    最近更新 更多