#apache-spark #hive #azure-data-lake #databricks #azure-databricks
#apache-spark #улей #azure-data-lake #databricks #azure-databricks
Вопрос:
У меня следующая проблема в Azure Databricks. Иногда, когда я пытаюсь сохранить фрейм данных в виде управляемой таблицы:
SomeData_df.write.mode('overwrite').saveAsTable("SomeData")
Я получаю следующую ошибку:
«Не удается создать управляемую таблицу (‘
SomeData
‘). Связанное местоположение (‘dbfs:/user /hive / warehouse / somedata’) уже существует.;»
Раньше я решал эту проблему, выполняя команду %fs rm для удаления этой папки, но теперь я использую кластер, которым управляет другой пользователь, и я больше не могу запускать rm в этой папке.
На данный момент единственное исправление, о котором я могу подумать, — это использование другого имени таблицы.
Что делает ситуацию еще более странной, так это тот факт, что таблица не существует. Когда я запускаю:
%sql
SELECT * FROM SomeData
Я получаю сообщение об ошибке:
Ошибка в инструкции SQL: исключение AnalysisException: Таблица или представление не найдены: SomeData;
Как я могу это исправить?
Комментарии:
1. Можете ли вы использовать
dbutils.fs.rm("dbfs:/user/hive/warehouse/Somedata/", true)
перед сохранением вместо%fs rm
?2. Эй, это сработало. Большое вам спасибо!
3. Ясное дело. Я добавил это также в качестве ответа, если вы хотите закрыть вопрос.
Ответ №1:
Кажется, есть несколько других с той же проблемой.
Временный обходной путь заключается в использовании
dbutils.fs.rm("dbfs:/user/hive/warehouse/SomeData/", true)
чтобы удалить таблицу перед ее повторным созданием.
Комментарии:
1. Спасибо, это решение сработало для меня, но мне пришлось написать с заглавной буквы True. Использовал версию databricks сообщества, если это имеет какое-либо значение.
Ответ №2:
Обычно это происходит, когда кластер завершает работу во время записи таблицы. Рекомендуемое решение из документации Databricks:
Этот флаг удаляет _STARTED каталог и возвращает процесс в исходное состояние. Например, вы можете установить его в записной книжке
%py
spark.conf.set("spark.sql.legacy.allowCreatingManagedTableUsingNonemptyLocation","true")
Комментарии:
1. Эта опция удалена в Spark 3.0, есть идеи по поводу вышеупомянутого поведения, о котором сообщалось в вопросе?
Ответ №3:
Все другие рекомендуемые здесь решения либо являются обходными путями, либо не работают. Режим указан как перезапись, что означает, что вам не нужно удалять базу данных или использовать устаревшие параметры.
Вместо этого попробуйте указать полный путь в параметрах при написании таблицы:
df.write
.option("path", "hdfs://cluster_name/path/to/my_db")
.mode("overwrite")
.saveAsTable("my_db.my_table")
Комментарии:
1. добавление пути исправило мою проблему, спасибо, Брендан
Ответ №4:
Для получения более внеконтекстного ответа запустите это в своей записной книжке:
dbutils.fs.rm("dbfs:/user/hive/warehouse/SomeData", recurse=True)
Согласно документации Databricks, это будет работать в записной книжке Python или Scala, но вам придется использовать волшебную команду %python
в начале ячейки, если вы используете записную книжку R или SQL.
Ответ №5:
У меня такая же проблема, я использую
create table if not exists USING delta
Если я сначала удаляю предложенные файлы, он создает их один раз, но во второй раз проблема повторяется, кажется, что create table not exists не распознает таблицу и все равно пытается ее создать
Я не хочу каждый раз удалять таблицу, я на самом деле пытаюсь использовать СЛИЯНИЕ для сохранения таблицы.
Комментарии:
1. Это произошло со мной при попытке создать управляемую таблицу с использованием CTA из другой таблицы. Я создал новую ячейку в databricks notebook и использовал эту конфигурацию, и это сработало:
%python spark.conf.set("spark.sql.legacy.allowCreatingManagedTableUsingNonemptyLocation","true")
. Более подробную информацию можно посмотреть в базе знаний Databricks: » kb.databricks.com/jobs/spark-overwrite-cancel.html »
Ответ №6:
Ну, это происходит потому, что вы пытаетесь записать данные в местоположение по умолчанию (без указания опции «путь») в режиме «перезапись». Как сказал Майк, вы можете установить для «spark.sql.legacy.allowCreatingManagedTableUsingNonemptyLocation» значение «true», но эта опция была удалена в Spark 3.0.0. Если вы попытаетесь установить этот параметр в Spark 3.0.0, вы получите следующее исключение:
Caused by: org.apache.spark.sql.AnalysisException: The SQL config 'spark.sql.legacy.allowCreatingManagedTableUsingNonemptyLocation' was removed in the version 3.0.0. It was removed to prevent loosing of users data for non-default value.;
Чтобы избежать этой проблемы, вы можете явно указать путь, по которому вы собираетесь сохранять, в режиме «перезапись».