当前位置: 首页 > 知识库问答 >
问题:

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

邓宜年
2023-03-14

我有一个PySpark数据帧,如下所示:

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

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

我试过这个:

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

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

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

  • 将PySpark数据帧转换为Pandas数据帧,因为行查找更快
  • 使用. where(). filter()虽然从我所尝试的来看,我不预期会更快
  • 使用. count()over是空的()

共有2个答案

西门靖琪
2023-03-14

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|
#  +-----+
晋言
2023-03-14

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

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|
+---+---+------+
 类似资料:
  • 问题内容: 我试图检查对象数组中是否存在特定项目(属性值),但找不到任何解决方案。请让我知道,我在这里想念的是什么。 问题答案: 您可以像这样过滤数组: 它将返回匹配闭包中指定条件的元素数组-在上述情况下,它将返回包含所有属性等于1的元素的数组。 由于您需要布尔结果,因此只需执行以下检查: 如果过滤后的数组至少包含一个元素,则为true

  • 问题内容: 我具有以下数据库结构: 在我的项目永久链接页面上,我有一个“添加到收藏夹”按钮,可在其中插入新行 如果用户已经在收藏夹中将其替换为“从收藏夹中删除”按钮,我希望能够将其替换。 我无法弄清楚其背后的逻辑-是否需要检查其中是否存在具有当前用户ID和永久链接ID的行?这对我不起作用: 问题答案: 您可能想要这样的东西:

  • 问题内容: 我正在下面的代码中检查和文本字段中是否有任何输入。 当我按下按钮时,该语句没有执行任何操作。 问题答案: 仅将textfield 对象 与空字符串进行比较不是解决此问题的正确方法。您必须比较文本字段的属性,因为它是兼容类型并且包含您要查找的信息。 Swift 2.0: 守卫 : 如果 : Swift 3.0: 守卫 : 如果 :

  • 问题内容: 嗨,我正在尝试检查当前时间是否在某个时间范围内,例如8:00-16:30。下面的代码显示可以将当前时间作为字符串获取,但是不确定如何使用此值来检查它是否在上面指定的时间范围内。任何帮助将不胜感激! 问题答案: 有很多方法可以做到这一点。就我个人而言,如果可以避免的话,我不喜欢使用字符串。我宁愿处理日期组件。 下面的代码创建的日期为8:00和16:30,然后比较日期以查看当前日期/时间是

  • 问题内容: 我需要帮助检查数据库中是否存在行。就我而言,该行包含一个电子邮件地址。我得到结果: 这是我当前正在使用的代码: 有没有更好的方法来检查MySQL中是否存在行(在我的情况下,检查MySQL中是否存在电子邮件)? 问题答案: 以下是经过尝试,测试和证明的检查行是否存在的方法。 (其中一些我自己使用,或者过去使用过)。 编辑: 我在使用两次的语法中犯了一个先前的错误。请查阅修订版本。 即:

  • 我需要帮助检查数据库中是否存在行。在我的例子中,该行包含一个电子邮件地址。我得到的结果是: 这是我目前使用的代码: 有没有更好的方法来检查MySQL中是否存在行(在我的例子中,检查MySQL中是否存在电子邮件)?