如何在Spark SQL中使用压缩列存储?

如何在Spark SQL中使用压缩列存储?,sql,apache-spark,Sql,Apache Spark,目标: 我想在稀疏数据集上使用用户Spark。我知道SparkSQL现在支持柱状数据存储(我相信是通过SchemaRDD实现的)。我听说columnar store的压缩已经实现,但目前默认情况下已关闭 我可以确保Spark将我的数据集存储为压缩的、内存中的列式存储 我所尝试的: 在Spark峰会上,有人告诉我必须打开压缩功能,如下所示: conf.set("spark.sql.inMemoryStorage.compressed", "true") 然而,这样做似乎对我的内存占用没有任何影响

目标:

我想在稀疏数据集上使用用户Spark。我知道SparkSQL现在支持柱状数据存储(我相信是通过SchemaRDD实现的)。我听说columnar store的压缩已经实现,但目前默认情况下已关闭

我可以确保Spark将我的数据集存储为压缩的、内存中的列式存储

我所尝试的:

在Spark峰会上,有人告诉我必须打开压缩功能,如下所示:

conf.set("spark.sql.inMemoryStorage.compressed", "true")
然而,这样做似乎对我的内存占用没有任何影响

以下是我的测试代码片段:

case class Record(i: Int, j: Int)
...
val conf = new SparkConf().setAppName("Simple Application")
conf.set("spark.sql.inMemoryStorage.compressed", "true")
val sc = new SparkContext(conf)
val sqlContext = new org.apache.spark.sql.SQLContext(sc)
import sqlContext._
val records = // create an RDD of 1M Records
val table = createSchemaRDD(records)
table.cache
在一种情况下,我创建记录,使I和j的所有值都是唯一的。在本例中,我看到使用了89.4MB

在第二种情况下,我创建记录,使I和j的大多数值都为0。(大约99.9%的条目为0)。在本例中,我看到使用了43.0MB

我期望更高的压缩比。有什么我应该做的不同吗


感谢您的帮助。

您希望在Spark 1.0.2中使用的设置是:

spark.sql.inMemoryColumnarStorage.compressed

只需将其设置为“true”。我在我的
conf/spark defaults.conf
中这样做


刚刚验证了这会产生更小的内存占用。

sqlContext。需要cacheTable
.cache
不会使用内存中的列式存储缓存表。

现在看起来是这样,不是吗?“Spark SQL可以通过调用Spark.catalog.cacheTable(“tableName”)或dataFrame.cache()”()来缓存使用内存列格式的表。我尝试了此操作,但无法确认Spark.catalog.cacheTable(“tableName”)或dataFrame.cache()是否使用内存列格式缓存表!对我不起作用。。。