首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >数据库上的火花-缓存Hive表

数据库上的火花-缓存Hive表
EN

Stack Overflow用户
提问于 2018-03-19 14:25:33
回答 2查看 1.9K关注 0票数 2

我们将事实表(30列)存储在S3上的拼花文件中,并在此文件上创建表并随后缓存它。表使用以下代码片段创建:

代码语言:javascript
运行
复制
val factTraffic = spark.read.parquet(factTrafficData)
factTraffic.write.mode(SaveMode.Overwrite).saveAsTable("f_traffic")
%sql CACHE TABLE f_traffic

我们在这个表(文件)上运行许多不同的计算,并且正在寻找缓存数据的最佳方法,以便在随后的计算中更快地访问数据。问题是,由于某种原因,从拼板读取数据并进行计算,然后从内存中访问数据会更快。一个重要的注意事项是,我们没有利用每一栏。通常,每次计算大约6-7列,每次都有不同的列.

有没有一种方法可以在内存中缓存这个表,这样我们就可以更快地访问它,而不是从地板上读取?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-03-19 20:44:49

缓存中的母化数据格式,您应该这样做:

代码语言:javascript
运行
复制
val factTraffic = spark.read.parquet(factTrafficData)
factTraffic.write.mode(SaveMode.Overwrite).saveAsTable("f_traffic")
val df_factTraffic = spark.table("f_traffic").cache
df_factTraffic.rdd.count
// now df_factTraffic is materalized in memory

另见https://stackoverflow.com/a/42719358/1138523

但是,这是否有意义是值得怀疑的,因为parquet是一种柱状文件格式(这意味着投影非常有效),而且如果每个查询都需要不同的列,缓存将不会对您有所帮助。

票数 1
EN

Stack Overflow用户

发布于 2018-03-22 18:13:53

听起来您在Databricks上运行,所以您的查询可能会自动受益于数据库IO缓存。从Databricks 文档

Databricks IO缓存通过使用快速中间数据格式在节点本地存储中创建远程文件副本来加速数据读取。每当必须从远程位置获取文件时,数据就会自动缓存。然后在本地执行对相同数据的连续读取,从而显着地提高读取速度。 Databricks IO缓存支持从DBFS、Amazon S3、HDFS、Azure Blob存储和Azure Data读取Parquet文件。它不支持其他存储格式,如CSV、JSON和ORC。

Databricks运行时3.3或更高版本支持Databricks IO缓存。默认情况下是否启用它取决于您为集群上的工作人员选择的实例类型:目前,它自动为Azure Ls实例和AWS i3实例启用(有关详细信息,请参阅Databricks文档的AWSAzure版本)。

如果此Databricks IO缓存生效,那么显式地使用带有未转换基表的Spark的RDD缓存可能会损害查询性能,因为它将存储数据的第二个冗余副本(并为此支付往返解码和编码)。

如果您正在缓存一个转换的数据集,那么显式缓存仍然是有意义的,例如,在对数据进行过滤以显著减少数据量之后,但是如果您只想缓存一个大型和未转换的基本关系,那么我个人建议依赖Databricks IO缓存,并避免Spark的内置RDD缓存。

有关更多细节,请参见完整的Databricks IO缓存文档,包括关于缓存升温、监视以及RDD和Databricks IO缓存的比较的信息。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49365308

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档