我使用Spark with Java连接器来处理我的数据。
我需要对数据执行的一项基本操作是计算数据框中的记录数(行数)。
我尝试df.count()
但执行时间非常慢(2-3M记录为30-40秒)。
此外,由于系统的要求,我不想使用df.rdd().countApprox()
API,因为我们需要确切的计数。
有人可以给我一个关于任何返回与df.count()
完全相同的替代方案的建议,并且执行时间更快吗?
非常感谢您的回复。
答案 0 :(得分:3)
df.cache
df.count
它第一次会很慢,因为它在第一次执行计数期间进行缓存,但在后续计数中将为您提供良好的性能。
利用df.cache
取决于用例。
答案 1 :(得分:1)
检查数据框是否有行的简单方法是执行Try(df.head)。如果成功,那么数据框中至少有一行。如果失败,则数据帧为空。 Here's a scala implementation of this.
答案 2 :(得分:1)
伯爵很快。您需要查看其他一些操作,数据加载和转换,以生成您正在计算的数据框。这就是让你减速而不是计数本身的部分。
如果您可以减少加载的数据量或删除任何不影响计数的转换,您可以加快速度。如果这不是一个选项,你可能会。更有效地编写转换。不知道你的转变虽然不可能说出瓶颈可能是什么。
答案 3 :(得分:0)
我刚刚发现将数据加载到Spark数据框中以进行进一步的查询和计数是不必要的。
相反,我们可以使用aerospike客户端来完成这项工作,它比上述方法快得多。
以下是如何使用aerospike客户端的参考 http://www.aerospike.com/launchpad/query_multiple_filters.html
谢谢大家