Оптимизируйте таблицы, используемые более одного раза: сохраняйте структуру данных или сохраняйте ее как паркет - PullRequest
0 голосов
/ 10 марта 2019

Я слышал, что 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 Как работает createOrReplaceTempView в Spark?

2) сделать tab0 постоянным

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

Какой из них лучше с точки зрения скорости запросов?

1 Ответ

1 голос
/ 10 марта 2019

Если у вас достаточно памяти для хранения данных, использование dataFrame.cache() будет быстрее, чем запись на диск в виде Parquet и использование TempView для доступа к ним.TempView потенциально может перейти на диск N раз.

Если у вас недостаточно памяти, я бы проверил и посмотрел, есть ли разница между сохранением на уровне хранения MEMORY_AND_DISK и записью в Parquet.Мне трудно представить, что формат диска, который использует Spark, будет менее эффективнее, чем Parquet (потому что почему бы просто не использовать Parquet в этом случае?), Но я научился быть осторожным с моими предположениями, когдаоптимизация кода Spark.

...