Apache spark 如何估计Spark数据帧中每列的字节大小?

Apache spark 如何估计Spark数据帧中每列的字节大小?,apache-spark,pyspark,Apache Spark,Pyspark,我有一个非常大的Spark数据框,它有许多列,我想根据它们的大小来判断是否将它们保留在我的管道中。所谓“多大”,我指的是缓存此数据帧时RAM中的字节大小,我希望这是处理此数据的计算成本的合理估计。有些列是简单类型(例如double、integer),但其他列是复杂类型(例如可变长度的数组和映射) 我尝试过的一种方法是在不缓存数据帧的情况下缓存数据帧,然后使用有问题的列,查看Spark UI中的存储选项卡,并考虑差异。但是对于一个有很多列的数据帧来说,这是一个烦人且缓慢的练习 我通常使用PySpa

我有一个非常大的Spark数据框,它有许多列,我想根据它们的大小来判断是否将它们保留在我的管道中。所谓“多大”,我指的是缓存此数据帧时RAM中的字节大小,我希望这是处理此数据的计算成本的合理估计。有些列是简单类型(例如double、integer),但其他列是复杂类型(例如可变长度的数组和映射)

我尝试过的一种方法是在不缓存数据帧的情况下缓存数据帧,然后使用有问题的列,查看Spark UI中的存储选项卡,并考虑差异。但是对于一个有很多列的数据帧来说,这是一个烦人且缓慢的练习


我通常使用PySpark,因此PySpark答案更可取,但Scala也可以。

我找到了一个基于此相关答案的解决方案:

假设我正在使用名为
df
的数据帧和名为
spark
SparkSession
对象:

import org.apache.spark.sql.{functions => F}

// force the full dataframe into memory (could specify persistence
// mechanism here to ensure that it's really being cached in RAM)
df.cache()
df.count()

// calculate size of full dataframe
val catalystPlan = df.queryExecution.logical
val dfSizeBytes = spark.sessionState.executePlan(catalystPlan).optimizedPlan.stats.sizeInBytes

for (col <- df.columns) {
    println("Working on " + col)

    // select all columns except this one:
    val subDf = df.select(df.columns.filter(_ != col).map(F.col): _*)

    // force subDf into RAM
    subDf.cache()
    subDf.count()

    // calculate size of subDf
    val catalystPlan = subDf.queryExecution.logical
    val subDfSizeBytes = spark.sessionState.executePlan(catalystPlan).optimizedPlan.stats.sizeInBytes

    // size of this column as a fraction of full dataframe
    val colSizeFrac = (dfSizeBytes - subDfSizeBytes).toDouble / dfSizeBytes.toDouble
    println("Column space fraction is " + colSizeFrac * 100.0 + "%")
    subDf.unpersist()
}
import org.apache.spark.sql.{functions=>F}
//强制将完整数据帧放入内存(可能指定持久性
//机制,以确保它确实被缓存在RAM中)
df.cache()
df.count()
//计算完整数据帧的大小
val catalystPlan=df.queryExecution.logical
val dfSizeBytes=spark.sessionState.executePlan(catalystPlan).optimizedPlan.stats.sizeInBytes

对于(col Nice,但是你真正从中得到了什么?它有什么帮助?简言之,如果我在运行基础设施约束,我可以(1)获取更大的infra或(2)删除一些数据。此计算帮助我对删除每个列的潜在好处做出明智的决定。我运行了它,但它不是那么明显。Thx