优化多次使用的表:使数据帧持久化或另存为镶木地板
Posted
技术标签:
【中文标题】优化多次使用的表:使数据帧持久化或另存为镶木地板【英文标题】:Optimize tables used more than once: make dataframe persistent or save as parquet 【发布时间】:2019-03-09 21:25:39 【问题描述】:听说 Spark SQL 很懒惰:每当引用结果表时,Spark 都会重新计算该表:(
例如,
WITH tab0 AS (
-- some complicated SQL that generates a table
-- with size of Giga bytes or Tera bytes
),
tab1 AS (
-- use tab0
),
tab2 AS (
-- use tab0
),
...
tabn AS (
-- use tab0
),
select * from tab1
join tab2 on ...
...
join tabn on ...
...
Spark 可以重新计算 tab0 N 次。
为避免这种情况,可以将 tab0 保存为临时表。我找到了两个解决方案。
1) 将 tab0 保存到 parquet 中,然后将其加载到临时视图中
https://community.hortonworks.com/articles/21303/write-read-parquet-file-in-spark.html How does createOrReplaceTempView work in Spark?
2) 使 tab0 持久化
https://spark.apache.org/docs/2.2.0/rdd-programming-guide.html#rdd-persistence
在查询速度方面哪个更好?
【问题讨论】:
【参考方案1】:如果您有足够的内存来保存数据,使用dataFrame.cache()
将比以 Parquet 形式写入磁盘并使用 TempView 访问它更快。 TempView 可能会转到磁盘 N 次。
如果您没有足够的内存,我会进行基准测试,看看在 MEMORY_AND_DISK 存储级别和写入 Parquet 之间是否存在差异。我很难想象 Spark 使用的磁盘格式会比 Parquet 效率低(因为在这种情况下为什么不直接使用 Parquet?),但我已经学会小心我的假设在优化 Spark 代码时。
【讨论】:
以上是关于优化多次使用的表:使数据帧持久化或另存为镶木地板的主要内容,如果未能解决你的问题,请参考以下文章