【问题标题】:How to quickly check if row exists in PySpark Dataframe?如何快速检查 PySpark Dataframe 中是否存在行?
【发布时间】:2021-05-14 14:55:37
【问题描述】:

我有一个这样的 PySpark 数据框:

+------+------+
|     A|     B|
+------+------+
|     1|     2|
|     1|     3|
|     2|     3|
|     2|     5|
+------+------+

我想对表进行查找以查看是否存在特定行。例如,对于A = 2、B = 5 的测试,代码应返回True,对于A = 2、B = 10,代码应返回False。

我试过这个:

df[(df['A'] == 1) & (df['B'] == 2)].rdd.isEmpty()

不幸的是,这段代码需要很长时间才能执行,而且由于这是一个将执行多次的查找(对于不同的 A 和 B 值),我希望有一个更快的方法来完成这项任务。

我正在考虑的其他解决方案是:

  • 将 PySpark 数据帧转换为 Pandas 数据帧,因为行查找速度更快
  • 使用 .where() 或 .filter() 虽然根据我的尝试,我预计两者都不会明显更快
  • 在isEmpty() 上使用.count()

【问题讨论】:

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


    【解决方案1】:

    最好从要查找的条目中创建一个 spark 数据框,然后执行 semi join 或 anti join 以获取查找数据框中存在或不存在的行。这应该比逐个检查条目更有效。

    import pyspark.sql.functions as F
    
    df = spark.createDataFrame([[2,5],[2,10]],['A','B'])
    
    result1 = df.join(lookup, ['A','B'], 'semi').withColumn('exists', F.lit(True))
    
    result2 = df.join(lookup, ['A','B'], 'anti').withColumn('exists', F.lit(False))
    
    result = result1.unionAll(result2)
    
    result.show()
    +---+---+------+
    |  A|  B|exists|
    +---+---+------+
    |  2|  5|  true|
    |  2| 10| false|
    +---+---+------+
    

    【讨论】:

      【解决方案2】:

      Spark 函数ANY 提供了一种非常快速的方法来检查数据帧中是否存在记录。

      check = df.selectExpr('ANY((A = 2) AND (B = 5)) as chk')
      
      check.show()
      #  +----+
      #  | chk|
      #  +----+
      #  |true|
      #  +----+
      
      check = df.selectExpr('ANY((A = 2) AND (B = 10)) as chk')
      check.show()
      #  +-----+
      #  |  chk|
      #  +-----+
      #  |false|
      #  +-----+
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-03-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-11-20
        相关资源
        最近更新 更多