Apache spark 当spark sql中的某个操作从未使用列时,它是否加载到内存中?
当我在一个Spark数据帧中有许多列,但只使用了其中的一些列时,Spark是否足够聪明,不会将未使用的列加载到内存中?在大多数情况下,Spark的优化器应该足够聪明,只加载所需的列(投影下推)。这对于柱状文件格式(如拼花地板)尤其强大,这意味着不需要读取整个文件 但我认为,在某些情况下,最好是做出一个显式的Apache spark 当spark sql中的某个操作从未使用列时,它是否加载到内存中?,apache-spark,apache-spark-sql,Apache Spark,Apache Spark Sql,当我在一个Spark数据帧中有许多列,但只使用了其中的一些列时,Spark是否足够聪明,不会将未使用的列加载到内存中?在大多数情况下,Spark的优化器应该足够聪明,只加载所需的列(投影下推)。这对于柱状文件格式(如拼花地板)尤其强大,这意味着不需要读取整个文件 但我认为,在某些情况下,最好是做出一个显式的select语句,我认为我看到过投影下推不够好的情况,主要是在非常复杂的查询中 当然,请使用spark的df。解释这可能有助于您了解执行查询时发生的情况:。你的意思可能是这样吗?所以,我想意思
select
语句,我认为我看到过投影下推不够好的情况,主要是在非常复杂的查询中
当然,请使用spark的
df。解释这可能有助于您了解执行查询时发生的情况:。你的意思可能是这样吗?所以,我想意思是:如果你从一个DF中写出3个col,得到10个col,那么它最初从一个数据源中只读取3个col,例如。我想你是这个意思吧。如果是这样的话,如果您对缓存的公共DF执行第二个操作,这将意味着Catalyst足够聪明,可以考虑这一点。我找不到这样的文件。JSON?根据我的经验,它将根据转换中使用的列(选择、筛选、联接、分组、窗口等)进行列修剪。但是当您打开数据源并且在调用persist之前不进行项目时,df.persist就不是这样了。正如Raphael提到的,使用df.explain和see进行项目时,还要确认df.persist影响项目查看带有缓存数据集的选项卡上的SparkUI,它们包含有关缓存的列和大小的信息。那么您验证了吗?我怀疑数据源是否需要进行列删减。@BluePhantom您应该阅读本文:可以,谢谢您的提示,但在阅读之前,您会声明,如果我对spark.read.jdbc有“自定义查询”,它将修改发送的实际语句?