【问题标题】:UDF function to check whether my input dataframe has duplicate columns or not using pyspark使用 pyspark 检查我的输入数据框是否有重复列的 UDF 函数
【发布时间】:2020-01-08 03:03:05
【问题描述】:

如果我的输入数据框有重复的同名列,我需要返回布尔值 false。我写了下面的代码。它从输入数据框中识别重复的列,并将重复的列作为列表返回。但是当我调用这个函数时,它必须返回布尔值,即,如果我的输入数据框有重复的同名列,它必须返回flase。

@udf('string')
def get_duplicates_cols(df, df_cols):
    duplicate_col_index = list(set([df_cols.index(c) for c in df_cols if df_cols.count(c) == 2]))
    for i in duplicate_col_index:
      df_cols[i] = df_cols[i] + '_duplicated'
      df2 = df.toDF(*df_cols)
    cols_to_remove = [c for c in df_cols if '_duplicated' in c]
    return cols_to_remove
duplicate_cols = udf(get_duplicates_cols,BooleanType())

【问题讨论】:

  • 为什么要使用udf?也可以不使用 udf。

标签: pyspark pyspark-dataframes


【解决方案1】:

你不需要任何 UDF,你只需要一个 Python 函数。检查将在 Python 中而不是在 JVM 中。因此,正如@Santiago P 所说,您可以使用 checkDuplicate ONLY

    def checkDuplicate(df):
        return len(set(df.columns)) == len(df.columns) 

【讨论】:

    【解决方案2】:

    假设您将数据框传递给函数。

    udf(returnType=BooleanType())
        def checkDuplicate(df):
            return len(set(df.columns)) == len(df.columns)
    

    【讨论】:

    • 它没有返回任何值。如果我的输入数据框包含任何重复的列,它必须返回 false。
    • 这个解决方案可以满足您的要求,False 如果有重复,True 如果没有重复列。我认为你在混合东西。在您的代码中,您试图返回重复列的名称列表 (ArrayType(StringType())。您不能根据结果返回不同的类型(在 udf 中)。 df.columns 为您提供数据框中的列列表,如果您想要重复值,我建议您阅读此post
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-24
    • 2018-05-11
    • 2020-04-30
    • 2013-05-31
    相关资源
    最近更新 更多