Разница между df.SaveAsTable и spark.sql (Создать таблицу ..) - PullRequest
2 голосов
/ 15 апреля 2019

Ссылаясь на здесь о разнице между saveastable и insertInto

В чем разница между следующими двумя подходами:

df.saveAsTable("mytable");

и

df.createOrReplaceTempView("my_temp_table");
spark.sql("drop table if exists " + my_temp_table);
spark.sql("create table mytable as select * from 
my_temp_table");

В каком случае таблица хранится в памяти, а в каком случае физически на диске?

Кроме того, насколько я понимаю, createOrReplaceTempView регистрирует только тот кадр данных (уже в памяти), который будет доступен черезУлейный запрос, фактически не сохраняя его, это правильно?

Мне нужно присоединиться к сотням столов и решить проблему OutOfMemory.С точки зрения эффективности, что будет лучшим способом?

  • df.persist() и df.join (..). Join (..). Join (..) .... # сотен объединений

  • createOrReplaceTempView, затем присоединитесь с spark.sql(),

  • SaveAsTable (? Не уверен, что следующий шаг)

  • Записьна диск с Create Table, затем присоединитесь с spark.sql()?

1 Ответ

3 голосов
/ 16 апреля 2019

Пойдем пошагово.

В случае df.saveAsTable("mytable") таблица фактически записывается в хранилище (HDFS / S3). Это искра.

С другой стороны: df.createOrReplaceTempView("my_temp_table") - это трансформация. Это просто идентификатор, который будет использоваться для DAG df. На самом деле ничего не хранится в памяти или на диске.

spark.sql("drop table if exists " + my_temp_table) опускает стол.

spark.sql("create table mytable as select * from my_temp_table") создает mytable в хранилище. createOrReplaceTempView создает таблицы в базе данных global_temp.

Лучше всего изменить запрос на:

create table mytable as select * from global_temp.my_temp_table

createOrReplaceTempView регистрирует только фрейм данных (уже в доступ к памяти через запрос Hive, без сохраняя это, это правильно?

Да, для больших групп доступности баз данных spark автоматически кеширует данные в зависимости от настройки spark.memory.fraction. Проверьте эту страницу.

Мне нужно присоединиться к сотням столов и решить проблему OutOfMemory. С точки зрения эффективности, что было бы лучшим способом?

df.persist() and df.join(..).join(..).join(..).... #hundred joins

createOrReplaceTempView then join with spark.sql(),

SaveAsTable (? not sure the next step)

Write to disk with Create Table then join with spark.sql()?

persist будет хранить некоторые данные в кэшированном формате в зависимости от доступной памяти и для конечной таблицы, которая генерируется путем объединения сотен таблиц, это, вероятно, не лучший подход.

Невозможно предложить подход, который будет работать для вас, но вот некоторые общие закономерности:

Если запись завершается неудачно с помощью OOM и используется значение по умолчанию spark.shuffle.partitions, то отправной точкой является увеличение числа разделов в случайном порядке, чтобы гарантировать правильное изменение размера каждого раздела исполнителя в зависимости от доступности его памяти.

Параметр spark.shuffle.partitions можно установить для разных объединений, он не должен быть постоянным для задания Spark.

Расчет размера раздела затруднен, если задействованы несколько таблиц. В этом случае хорошей идеей будет запись на диск и чтение перед большими таблицами.

Для небольших столов, менее 2 ГБ, возможна трансляция. Ограничение по умолчанию составляет 10 МБ (я думаю), но его можно изменить.

Было бы лучше, если бы финальная таблица сохранялась на диске, а не обслуживала клиентов через временные таблицы.

Удачи!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...