如何快速检查 PySpark Dataframe 中是否存在行?
How to quickly check if row exists in PySpark Dataframe?
我有一个像这样的 PySpark 数据框:
+------+------+
| A| B|
+------+------+
| 1| 2|
| 1| 3|
| 2| 3|
| 2| 5|
+------+------+
我想查找 table 以查看特定行是否存在。例如,对于 A = 2
、B = 5
的测试代码应为 return True
,对于 A = 2
、B = 10
的代码应为 return False
.
我试过这个:
df[(df['A'] == 1) & (df['B'] == 2)].rdd.isEmpty()
不幸的是,这段代码需要很长时间才能执行,并且由于这是一个将执行多次的查找(对于 A 和 B 的不同值),我希望有一个更快的方法来完成这个任务.
我正在考虑的其他解决方案是:
- 将 PySpark 数据帧转换为 Pandas 数据帧,因为行查找速度更快
- 使用
.where()
或 .filter()
尽管根据我的尝试,我预计两者都不会快得多
- 使用
.count()
而不是 isEmpty()
最好从要查找的条目创建一个 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|
+---+---+------+
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|
# +-----+
我有一个像这样的 PySpark 数据框:
+------+------+
| A| B|
+------+------+
| 1| 2|
| 1| 3|
| 2| 3|
| 2| 5|
+------+------+
我想查找 table 以查看特定行是否存在。例如,对于 A = 2
、B = 5
的测试代码应为 return True
,对于 A = 2
、B = 10
的代码应为 return False
.
我试过这个:
df[(df['A'] == 1) & (df['B'] == 2)].rdd.isEmpty()
不幸的是,这段代码需要很长时间才能执行,并且由于这是一个将执行多次的查找(对于 A 和 B 的不同值),我希望有一个更快的方法来完成这个任务.
我正在考虑的其他解决方案是:
- 将 PySpark 数据帧转换为 Pandas 数据帧,因为行查找速度更快
- 使用
.where()
或.filter()
尽管根据我的尝试,我预计两者都不会快得多 - 使用
.count()
而不是isEmpty()
最好从要查找的条目创建一个 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|
+---+---+------+
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|
# +-----+