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

mklgxw1f  于 2021-07-13  发布在  Spark
关注(0)|答案(1)|浏览(313)

我有一个PyparkDataframe,如下所示:

+------+------+
|     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的不同值),我希望有一个更快的方法来完成这项任务。
我正在考虑的其他解决方案有:
将pysparkDataframe转换为pandasDataframe,因为行查找速度更快
使用 .where() 或者 .filter() 虽然从我的尝试来看,我并不认为这两种方法都会更快
使用 .count() 结束 isEmpty() 请告诉我其他人在这种情况下做了什么。谢谢!

sxpgvts3

sxpgvts31#

最好从要查找的条目中创建一个sparkDataframe,然后执行 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|
+---+---+------+

相关问题