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

时间:2014-07-14 22:49:32

标签: sql apache-spark

目标:

我想在稀疏数据集上使用Spark。据我所知,SparkSQL现在支持列式数据存储(我相信通过SchemaRDD)。我被告知已实施柱状存储的压缩,但默认情况下当前已关闭。

我可以确保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。

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

感谢您的帮助。

2 个答案:

答案 0 :(得分:3)

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

spark.sql.inMemoryColumnarStorage.compressed

将其设置为“true”。我是在conf/spark-defaults.conf

中完成的

刚刚确认这会产生更小的内存占用。

答案 1 :(得分:0)

sqlContext.cacheTable是必需的。 .cache不会使用内存中的柱状存储来缓存表。