繁体   English   中英

如何快速检查 PySpark Dataframe 中是否存在行?

[英]How to quickly check if row exists in PySpark Dataframe?

我有一个 PySpark dataframe 像这样:

+------+------+
|     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 dataframe 转换为 Pandas Z6A8064B5DF479455500553C47DZ50 查找速度更快50
  • 使用 .where( .where().filter()虽然我已经尝试过,但我预计两者都不会快得多
  • isEmpty()上使用.count() )

最好从要查找的条目中创建火花 dataframe,然后执行semi join联接或anti join联接以获取查找 dataframe 中存在或不存在的行。 这应该比逐个检查条目更有效。

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|
+---+---+------+

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

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|
#  +-----+

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM