[英]SQL Server using order by clause significantly improves select performance
[英]Spark SQL: Cache Memory footprint improves with 'order by'
我有两个场景,其中我有23 GB
分区parquet
数据并读取很少的columns
并预先caching
它以稍后触发一系列后续查询。
设置:
案例一:
val paths = Array("s3://my/parquet/path", ...)
val parqFile = sqlContext.read.parquet(paths:_*)
parqFile.registerTempTable("productViewBase")
val dfMain = sqlContext.sql("select guid,email,eventKey,timestamp,pogId from productViewBase")
dfMain.cache.count
从SparkUI
读取的输入数据为 6.2 GB,缓存对象为15.1 GB 。
案例一:
val paths = Array("s3://my/parquet/path", ...)
val parqFile = sqlContext.read.parquet(paths:_*)
parqFile.registerTempTable("productViewBase")
val dfMain = sqlContext.sql("select guid,email,eventKey,timestamp,pogId from productViewBase order by pogId")
dfMain.cache.count
从SparkUI
读取的输入数据为 6.2 GB,缓存对象为5.5 GB 。
对此行为的任何解释或代码参考?
其实还是比较简单的。 正如您在 SQL 指南中所读到的:
Spark SQL 可以使用内存中的列格式缓存表... Spark SQL 将仅扫描所需的列并自动调整压缩
排序列式存储的好处在于它很容易压缩典型数据。 排序时,您会得到这些相似记录的块,甚至可以使用非常简单的技术(如RLE )将它们压缩在一起。
这是一个在具有列式存储的数据库中实际上经常使用的属性,因为它不仅在存储方面非常有效,而且在聚合方面也非常有效。
sql.execution.columnar.compression
包涵盖了 Spark 列压缩的不同方面,如您所见, RunLengthEncoding
确实是可用的压缩方案之一。
所以这里有两部分:
如果列之间存在一些相关性(如果不是这种情况?)即使是基于单个列的简单排序也会产生相对较大的影响并提高不同压缩方案的性能。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.