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

Python 如何估计pyspark中的数据帧实际大小?,python,apache-spark,dataframe,spark-csv,Python,Apache Spark,Dataframe,Spark Csv,如何确定数据帧大小 现在,我估计数据帧的实际大小如下: 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 速度太慢,我正在寻找更好的方法。目前我正在使用以下方法,但不确定这是否是最好的方法: df.persist(

如何确定数据帧大小

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

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

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

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

df.persist(StorageLevel.Memory)
df.count()
在spark web UI的“存储”选项卡下,您可以检查以MB为单位显示的大小,然后我取消持久性以清除内存:

df.unpersist()

塔马斯·苏罗米的精彩帖子


您必须收集RDD以确定其大小,因此对于大型datasetI来说,它当然会很慢,我正在考虑使用SizeEstimator对象来估计RDD的样本。不幸的是,我找不到用python实现这一点的方法。我认为这解决了您的问题。正如我所说的,我实际上在寻找一个python实现@板球运动这是怎么回事?我已经测试了这段代码,在我看来,结果更像是一个“随机函数”作为一个估计。或者我误解了他们?我在cdh 5.11.2中使用spark 1.6,无论数据帧是什么,它都会返回相同的大小。它总是返回216MB,从185704232到186020448再到187366176,几乎没有什么变化。但是,记录的数量从5更改为2000000到150000000。我使用pyspark 2.4.4,不起作用,TypeError javaPackage not Callable不使用此。这不是真正的内存使用。它报告1B条记录的数据帧和10M条记录的数据帧的关闭数。谢谢,我可以在存储选项卡中检查大小。Gr8帮助如果您有一个非常大的数据集,这可能是一个坏主意。
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)