如何有效地计算数据帧的行数? [复制]

Posted

技术标签:

【中文标题】如何有效地计算数据帧的行数? [复制]【英文标题】:How to calculate the number of rows of a dataframe efficiently? [duplicate] 【发布时间】:2019-04-09 13:35:09 【问题描述】:

我有一个非常大的 pyspark 数据框,我会计算行数,但是 count() 方法太慢了。还有其他更快的方法吗?

【问题讨论】:

Getting the count of records in a data frame quickly 和 Count on Spark Dataframe is extremely slow 的可能重复 简短的回答是否定的,但如果你缓存它会加快后续调用计数。 连近似的方法都没有吗? 试试df.rdd.countApprox()也许 【参考方案1】:

如果您不介意获得近似计数,可以先尝试sampling the dataset,然后按您的采样因子进行缩放:

>>> df = spark.range(10)
>>> df.sample(0.5).count()
4

在这种情况下,您可以将 count() 结果缩放 2(或 1/0.5)。显然,这种方法存在统计误差。

【讨论】:

我正在尝试,但运行时间仍然相当长,虽然我使用的是 0.1 的因子。 数据分区好不好?如果没有,您可能没有利用所有执行者。就此而言,您的分区与执行者的比率是多少? 我没明白你的意思。但是,我使用 Google Colab 运行代码,我只是将 df.count() 操作替换为 df.sample(0.1).count() 并重新运行代码。还有什么要设置的吗? 要获取数据帧的分区数,请致电df.rdd.getNumPartitions()。如果该值为 1,则您的数据尚未并行化,因此您无法从 spark 集群中的多个节点或内核中受益。如果您确实获得了大于 1 的值(理想情况下,接近 200),那么接下来要看的是知道你的 spark 集群有多少可用的执行程序。您可以通过查看集群的 Spark 状态网页来执行此操作。 我正在尝试使用 df.coalesce() 方法设置分区数,但 Colab 不会生成超过四个分区。执行者只有一个,我不知道如何在 Google Colab 上增加它们。但是,Colab 使用的是六核处理器。

以上是关于如何有效地计算数据帧的行数? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

有效地计算文本文件的行数。 (200mb+)

如何有效地从 jupyter 或 colab 中的数据帧复制输出并以漂亮/可读的格式粘贴到 ***

根据单元格原始列的行数将特定单元格的内容复制到空列

根据来自不同数据帧的行名将列从另一个数据帧复制到

如何将列名打印为mysql中的行数? [复制]

如何有效地迭代 Pandas 数据帧的连续块