目标:
我想在稀疏数据集上使用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。
我期望更高的压缩率。有什么我应该做的不同吗?
感谢您的帮助。
答案 0 :(得分:3)
您要在Spark 1.0.2中使用的设置是:
spark.sql.inMemoryColumnarStorage.compressed
将其设置为“true”。我是在conf/spark-defaults.conf
。
刚刚确认这会产生更小的内存占用。
答案 1 :(得分:0)
sqlContext.cacheTable
是必需的。 .cache
不会使用内存中的柱状存储来缓存表。