优化使用多次的表:使数据框持久化或另存为拼合

时间:2019-03-09 21:25:39

标签: apache-spark pyspark apache-spark-sql pyspark-sql

我听说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保存到镶木地板中,然后将其加载到临时视图中

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 个答案:

答案 0 :(得分:1)

如果您有足够的内存来保存数据,则使用dataFrame.cache()的速度将比以Parquet写入磁盘并使用TempView进行访问更快。 TempView可能会转到磁盘N次。

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