如何有效地计算数据帧的行数? [复制]
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 使用的是六核处理器。以上是关于如何有效地计算数据帧的行数? [复制]的主要内容,如果未能解决你的问题,请参考以下文章