快速获取数据框中的记录数

时间:2016-09-06 20:22:21

标签: scala apache-spark hadoop-streaming

我有一个包含多达1000万条记录的数据框。我怎样才能快速计算? df.count需要很长时间。

3 个答案:

答案 0 :(得分:8)

反正要花很多时间。至少是第一次。

一种方法是缓存数据帧,因此除了计数之外,您还可以使用它。

例如

df.cache()
df.count()

后续操作不需要太多时间。

答案 1 :(得分:2)

对 DataFrame 中的记录进行计数所需的时间取决于集群的能力以及数据的存储方式。性能优化可以让 Spark 计数非常快。

与 CSV/JSON 文件相比,Spark 对 Parquet 文件执行计数更容易。 Parquet 文件将计数存储在文件页脚中,因此 Spark 不需要读取文件中的所有行并实际执行计数,它只需获取页脚元数据即可。 CSV / JSON 文件没有任何此类元数据。

如果数据存储在 Postgres 数据库中,那么计数操作将由 Postgres 执行,并且计数执行时间将是数据库性能的函数。

较大的集群通常会更快地执行计数操作(除非数据以某种方式倾斜,导致一个节点完成所有工作,而让其他节点空闲)。

snappy 压缩算法通常比 gzip 快,因为它可以被 Spark 拆分并且膨胀速度更快。

approx_count_distinct 在底层由 HyperLogLog 提供支持,但会以牺牲精度为代价,在不同计数方面的性能更高。

另一个答案建议在计数之前进行缓存,这实际上会减慢计数操作。缓存是一项昂贵的操作,可能比计数花费更多的时间。缓存有时是一项重要的性能优化,但如果您只是想要一个简单的计数,则不是。

答案 2 :(得分:1)

file.groupBy("<column-name>").count().show()