【问题标题】:Check if values of column pyspark df exist in other column pyspark df检查列 pyspark df 的值是否存在于其他列 pyspark df
【发布时间】:2020-11-27 03:57:55
【问题描述】:

我有 2 个 pyspark 数据框,我想检查一列的值是否存在于另一个数据框的列中。

我只看到了如何过滤存在的值的解决方案(like this),我需要做的是返回一个真或假的列。

在 pandas 中会是这样的:

df_A["column1"].isin(df_B["column1"])

提前致谢!

【问题讨论】:

    标签: python dataframe apache-spark pyspark apache-spark-sql


    【解决方案1】:

    您可以收集column1中的所有值,然后从中制作一个广播变量,您可以在其上编写一个udf

    from pyspark.sql import udf
    from pyspark.sql.types import BooleanType
    
    df_B_col_1_values = df_B.rdd.map(lambda x: x.column1).distinct().collect()
    df_B_col_1_values = sc.broadcast(set(df_B_col_1_values))
    
    my_udf = udf(lambda x: x in df_B_col_1_values.value, BooleanType())
    df_A = df_A.withColumn('column1_present', my_udf(col('column1'))
    

    【讨论】:

      【解决方案2】:

      编辑:更简洁的方法:

      import pyspark.sql.functions as F
      
      result = df1.join(df2.withColumn('flag', F.lit(True)), 'col1', 'left').fillna(False)
      
      result.show()
      +----+-----+
      |col1| flag|
      +----+-----+
      |   0| true|
      |   1| true|
      |   2|false|
      +----+-----+
      

      旧答案:

      df1 = spark.createDataFrame(([0],[1],[2])).toDF('col1')
      df2 = spark.createDataFrame(([0],[1],[3])).toDF('col1')
      
      df1.join(df2, 'col1', 'semi') \
         .distinct() \
         .select('col1', F.lit(True).alias('flag')) \
         .join(df1, 'col1', 'right') \
         .fillna(False, 'flag') \
         .show()
      
      +----+-----+
      |col1| flag|
      +----+-----+
      |   0| true|
      |   1| true|
      |   2|false|
      +----+-----+
      

      【讨论】:

      • 这个编辑后的响应有效 - 两个数据框必须具有相同名称的列(在 mck 的示例中,列是 'col1')并且它按预期工作。
      猜你喜欢
      • 2020-04-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-03-26
      • 1970-01-01
      • 2018-08-20
      • 2019-09-13
      • 2023-01-23
      相关资源
      最近更新 更多