优化使用多次使用的表:使DataFrame持久或另存为Parquet



我听说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 ...
...

火花可能会重新计算tab0 n次。

为避免这种情况,可以将TAB0保存为临时表。我找到了两个解决方案。

1)将TAB0保存到Parquet中,然后将其加载到temp View

https://community.hortonworks.com/articles/21303/write-read-parquet-file-in-spark.htmlCreateRreplaceTemPView在Spark中如何工作?

2)使TAB0持续

https://spark.apache.org/docs/2.2.0/rdd-programming-guide.html#rdd-persististence

在查询速度方面哪一个更好?

如果您有足够的内存可以保存数据,则使用dataFrame.cache()将比写入磁盘作为parquet并使用tempview访问它要快。TempView可能会进入磁盘n次。

如果您没有足够的内存,我将进行基准测试,看看是否坚持使用Memory_and_disk存储级别和写入Parquet之间有区别。我很难想象Spark使用的磁盘格式比Parquet效率低(因为在这种情况下不只是使用Parquet?),但是我学会了要小心我的假设优化火花代码时。

相关内容

  • 没有找到相关文章

最新更新