Пойдем пошагово.
В случае 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 МБ (я думаю), но его можно изменить.
Было бы лучше, если бы финальная таблица сохранялась на диске, а не обслуживала клиентов через временные таблицы.
Удачи!