caching - Spark SQL : how to cache sql query result without using rdd. 缓存()

标签 caching query-optimization apache-spark

有没有办法在不使用rdd.cache()的情况下缓存一个缓存sql查询结果? 例如:

output = sqlContext.sql("SELECT * From people")

我们可以使用output.cache()来缓存结果,但是我们不能使用sql查询来处理它。

所以我想问是否有类似sqlcontext.cacheTable()之类的东西来缓存结果?

最佳答案

您应该使用 sqlContext.cacheTable("table_name") 来缓存它,或者使用 CACHE TABLE table_name SQL 查询。

这是一个例子。我在 HDFS 上有这个文件:

1|Alex|alex@gmail.com
2|Paul|paul@example.com
3|John|john@yahoo.com

然后是PySpark中的代码:

people = sc.textFile('hdfs://sparkdemo:8020/people.txt')
people_t = people.map(lambda x: x.split('|')).map(lambda x: Row(id=x[0], name=x[1], email=x[2]))
tbl = sqlContext.inferSchema(people_t)
tbl.registerTempTable('people')

现在我们有了一个表并可以查询它:

sqlContext.sql('select * from people').collect()

要坚持它,我们有 3 个选择:

# 1st - using SQL
sqlContext.sql('CACHE TABLE people').collect()
# 2nd - using SQLContext
sqlContext.cacheTable('people')
sqlContext.sql('select count(*) from people').collect()     
# 3rd - using Spark cache underlying RDD
tbl.cache()
sqlContext.sql('select count(*) from people').collect()     

第一个和第二个选项是首选,因为它们将以优化的内存中列格式缓存数据,而第三个选项将像任何其他 RDD 一样以面向行的方式缓存数据

回到你的问题,这是一个可能的解决方案:

output = sqlContext.sql("SELECT * From people")
output.registerTempTable('people2')
sqlContext.cacheTable('people2')
sqlContext.sql("SELECT count(*) From people2").collect()

关于caching - Spark SQL : how to cache sql query result without using rdd. 缓存(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28027160/

相关文章:

javascript - Angular $templateCache 与 HTML5 浏览器缓存

python - 在测试中覆盖 Django 缓存设置

mysql - 建议一个优化的 mysql 查询

python - 分解多个列,在 PySpark 中保留列名称

apache-spark - 在数据框中将字符串转换为 double

hadoop - 配置单元分区列未通过sc.textFile在rdd中出现

android - 我们如何在流式传输后缓存 HLS 视频 url

ruby-on-rails - 如何在 Rails 中缓存模型对象?

mysql - 需要以某种方式加速我的数据库或查询

mysql - 我可以将此模式用于 where 子句的可选部分吗?