【问题标题】:Alternatives for Spark Dataframe's count() APISpark Dataframe 的 count() API 的替代方案
【发布时间】:2018-02-07 18:04:36
【问题描述】:

我正在使用带有 Java 连接器的 Spark 来处理我的数据。

我需要对数据执行的一项基本操作是计算数据框中的记录(行)数。

我尝试了df.count(),但执行时间非常慢(2-3M 记录需要 30-40 秒)。

另外,由于系统的要求,我不想使用df.rdd().countApprox() API,因为我们需要准确的计数。

有人可以给我一个建议,提供与df.count() 返回完全相同的结果且执行时间更快的任何替代方案吗?

非常感谢您的回复。

【问题讨论】:

  • 我认为没有更好的选择。但是,如果您对数据框执行多个操作,您可以考虑使用cache(),请参阅stackoverflow.com/questions/45749580/…
  • 我相信在您对其执行操作(而不是转换)之前实际上并未加载数据。因此,运行时间可能部分是由于从磁盘或数据库读取数据。
  • 您是否尝试使用registerTempTable,然后使用select count(*)df.selectExpr("count(*)").show?我猜它本质上是一样的,但你永远不知道。 :D
  • 是的,查询本身显示得非常快,因为在调用count() 之前实际上没有进行任何数据检索。 count() 本身应该比较快,你可以通过缓存数据并调用 count 两次来尝试,第一次(有数据检索)可能会很慢,而第二次(只执行实际的 count() 操作)应该明显更快。
  • 是的,它更快,但不幸的是,这不是我们的情况。不过还是谢谢。

标签: java apache-spark dataframe count spark-dataframe


【解决方案1】:

我刚刚发现无需将数据加载到 Spark 数据帧中以进行进一步查询和计数。

相反,我们可以使用 aerospike 客户端来完成这项工作,它比上述方法快得多。

这里是aerospike客户端使用方法的参考 http://www.aerospike.com/launchpad/query_multiple_filters.html

谢谢大家

【讨论】:

    【解决方案2】:

    计数非常快。您需要查看其他一些操作、数据加载和转换,以生成您正在计数的数据框。那是让你慢下来的部分,而不是计数本身。

    如果您可以减少加载的数据量或删除不影响计数的任何转换,则可以加快速度。如果这不是一个选项,你也许可以。更有效地编写您的转换。在不知道您的转换的情况下,虽然无法说出瓶颈可能是什么。

    【讨论】:

    • 谢谢普伦。就像我上面提到的,我正在将数据加载到 Spark 数据帧中以进行进一步的查询和计数,这是不必要的。现在使用 aerospike 客户端来完成这项工作,我认为这正是我想要的。
    【解决方案3】:

    检查数据框是否有行的一种简单方法是执行 Try(df.head)。如果成功,则数据框中至少有一行。如果失败,则数据框为空。 Here's a scala implementation of this.

    Here is the reason why df.count() is a slow operation.

    【讨论】:

    • 我想这与我的问题没有直接关系。不过谢谢,Sohum。
    【解决方案4】:
    df.cache
    df.count
    

    第一次会很慢,因为它在第一次执行 count 的过程中会缓存,但在随后的 count 会为您提供良好的性能。

    利用 df.cache 取决于用例。

    【讨论】:

    • 据我了解,如果我们在同一个数据集上调用多个操作,您的方法会更快,正如上面 cmets 的 Shaido 所指出的那样。但是,我们对每个数据集只有一个操作。之后,我们执行新查询以获取新数据集,并对其调用另一个计数操作。所以恐怕这种方法对我们的情况没有多大帮助。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-09-10
    • 1970-01-01
    • 2018-11-14
    • 1970-01-01
    • 2022-12-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多