如何估计pyspark中的数据框实际大小?

Posted

技术标签:

【中文标题】如何估计pyspark中的数据框实际大小?【英文标题】:How to estimate dataframe real size in pyspark? 【发布时间】:2016-09-01 19:48:31 【问题描述】:

如何确定数据框的大小?

现在我估计数据框的实际大小如下:

headers_size = key for key in df.first().asDict()
rows_size = df.map(lambda row: len(value for key, value in row.asDict()).sum()
total_size = headers_size + rows_size

太慢了,我正在寻找更好的方法。

【问题讨论】:

你必须收集RDD来确定它的大小,所以对于大数据集当然会很慢 我正在考虑使用 SizeEstimator 对象来估计 rdd 的样本。不幸的是,我无法在 python 中找到它。 我认为这可以解决您的问题。 spark.apache.org/docs/latest/… 我实际上正在寻找我所说的python实现。 @cricket_007 【参考方案1】:

目前我正在使用以下方法,但不确定这是否是最好的方法:

df.persist(StorageLevel.Memory)
df.count()

Storage 选项卡下的 spark-web UI 上,您可以检查以 MB 为单位显示的大小,然后我会继续清除内存:

df.unpersist()

【讨论】:

谢谢,我可以在存储选项卡中查看大小。 Gr8 帮助 如果你有一个非常大的数据集,这可能是个坏主意。 如果你有一个非常大的数据集,这只是一个问题或采样(例如 df.sample(.01))并遵循相同的步骤。然后你可以估计整个数据集的大小。 使用 df.persist(StorageLevel.MEMORY_AND_DISK)【参考方案2】:

来自 Tamas Szuromi http://metricbrew.com/how-to-estimate-rdd-or-dataframe-real-size-in-pyspark/ 的好帖子

from pyspark.serializers import PickleSerializer, AutoBatchedSerializer
def _to_java_object_rdd(rdd):  
    """ Return a JavaRDD of Object by unpickling
    It will convert each Python object into Java object by Pyrolite, whenever the
    RDD is serialized in batch or not.
    """
    rdd = rdd._reserialize(AutoBatchedSerializer(PickleSerializer()))
    return rdd.ctx._jvm.org.apache.spark.mllib.api.python.SerDe.pythonToJava(rdd._jrdd, True)

JavaObj = _to_java_object_rdd(df.rdd)

nbytes = sc._jvm.org.apache.spark.util.SizeEstimator.estimate(JavaObj)

【讨论】:

这应该如何工作?我已经测试了这段代码,在我看来,结果更像是一个“随机函数”作为估计。或者也许我误解了他们?我在 cdh 5.11.2 中使用 spark 1.6 无论数据框如何,这对我来说总是返回相同的大小。它总是返回 216 MB。 我看到的变化很小——从 185,704,232 到 186,020,448 到 187,366,176。但是,记录数从 5 变为 2,000,000 到 1,500,000,000。 我用的是pyspark 2.4.4,不工作,TypeError javaPackage not callable 不要使用这个。这不是真正的内存使用。它报告一个有 1B 条记录的 DataFrame 和另一个有 10M 条记录的数据框的关闭数。

以上是关于如何估计pyspark中的数据框实际大小?的主要内容,如果未能解决你的问题,请参考以下文章

PySpark数据框显示错误的值

如何有效地将 PySpark 数据框中的行相乘?

pyspark:删除所有行中具有相同值的列

如何将 pyspark 数据框列中的值与 pyspark 中的另一个数据框进行比较

如何在数据框的开头移动 pyspark 数据框的特定列

具有列或行最大限制的 Pyspark 数据框