Я создал новый экземпляр Databricks Premium в Azure и попытаюсь ли я создать дельта-таблицу со следующим кодом PySpark:
if chkDir == 'False' or chkTbl == False:
ent.setupDeltaTable(stageName,regName)
#register data frame
deltadf = DeltaTable.forName(spark,f"{stageName}{regName}")
else:
#register data frame
deltadf = DeltaTable.forName(spark,f"{stageName}{regName}")
Я получаю ошибку:
AnalysisException: `BASEsqlArea2`.`Country` is not a Delta table.
Полная ошибка выглядит следующим образом:
Честно говоря, я думаю, что проблема в f"{stageName}{regName}". По какой-то причине Databricks отделяет имя базы данных от имени таблицы точкой.
Я должен отметить, что у меня нет такой проблемы с Databricks Community Edition. Таким образом, это заставляет меня думать, что ситуация связана с DBR версии 12.2 LTS (включая Apache Spark 3.3.2, Scala 2.12).
Кроме того, я не знаю, связано ли это, но недавно создав новый экземпляр Azure Databricks, Databricks больше не создает базу данных в Hive_metastore по умолчанию? См. изображение. В последний раз, когда я создавал новый экземпляр Databricks (около 4 месяцев назад) и таблицу Delta, Databricks автоматически создавал базу данных и таблицы в Hive_metastore. Теперь кажется, что база данных и таблицы автоматически создаются под именем самого экземпляра Databricks. Внесли ли Databricks некоторые изменения в то, где создаются базы данных и таблицы?
Я только что выполнил код еще раз и в дополнение к вышеуказанной ошибке теперь получаю дополнительную ошибку:
[RequestId=64a0cd67-33fe-4c5f-9e99-xxxxxx ErrorClass=INVALID_PARAMETER_VALUE] GenerateTemporaryPathCredential uri /mnt/lake/BASE/CombinedClass/sqlArea2/data/Country/1 is not a valid URI. Error message: INVALID_PARAMETER_VALUE: Missing cloud file system scheme.
Такой ошибки я еще не видел. Опять же, я вообще не получаю этой ошибки при выполнении кода в Databricks Community Edition.
Я попробовал следующее предложение, чтобы решить эту проблему с помощью следующего кода: stageName = "BASEsqlArea2" regName = "Страна" chkDir = 'Ложь' chkTbl = Ложь если chkDir == 'False' или chkTbl == False: ent.setupDeltaTable(stageName,regName) deltadf = DeltaTable.forPath(spark, f"/FileStore/tables/delta/{stageName}/{regName}") deltadf.toDF().show()
Однако я получаю следующую ошибку:
BASEsqlArea2 - Database created
Warning: Unmapped Spark type 'ByteType()' encountered, defaulting to 'STRING'
Table creation failed
AnalysisException: `/FileStore/tables/delta/BASEsqlArea2/Country` is not a Delta table.
Должен отметить, что мой Каталог выглядит следующим образом:
Также мои stageName и regName выглядят следующим образом:
Можете ли вы попробовать все вышеперечисленное и сообщить мне, помогло ли это вам?
Привет @DileepRajNarayanThumula, спасибо, что обратились к нам. Сейчас попробую ваше предложение и дам вам знать
DeltaTable.forName(destMasterTable).as("t") ...попробуйте тоже это
Привет @DileepRajNarayanThumula, я обновил вопрос, указав результаты вашего предложения. Я также добавил несколько примечаний, которые могут помочь в устранении неполадок. Спасибо
def setupDeltaTable(stageName, regName): путь = f"/FileStore/tables/delta/{stageName}/{regName}", если не DeltaTable.isDeltaTable(spark, path): data = [("Джеймс", "Смит") , ("Анна", "Роза")] df = spark.createDataFrame(data, ["имя", "фамилия"]) df.write.format("дельта").mode("перезаписать").save(путь ) print(f"Дельта-таблица создана по адресу {path}.") else: print(f"Дельта-таблица уже существует по адресу {path}.")
stageName = "BASEsqlArea2" regName = "Country" chkDir = 'False' chkTbl = False, если chkDir == 'False' или chkTbl == False: setupDeltaTable(stageName, regName) deltadf = DeltaTable.forPath(spark, f"/FileStore/ table/delta/{stageName}/{regName}") deltadf.toDF().show()
Можете ли вы попробовать сейчас?
Сейчас попробую другие ваши предложения...
При вашем втором предложении я получаю сообщение об ошибке NameError: name 'DeltaTable' is not defined, и ошибка указывает на if not DeltaTable.isDeltaTable(spark, path): .
Я ответил полным кодом, который я пробовал до сих пор, можете ли вы проверить, помогает ли это вам, и дайте мне знать, пожалуйста
Очень странно, что я получаю ошибку NameError для DeltaTable. Согласны ли вы, что мне не нужно определять «DeltaTable»?
о, я только что увидел, что ты ответил с полным кодом. Я проверю это сейчас.
да, пожалуйста, поскольку ОШИБКА предполагает, что BASEsqlArea2.Country не является дельта-таблицей. Поэтому я попытался создать дельта-таблицу и применил подход, который вы задали в вопросе.





Когда я попытался зарегистрировать таблицу Delta с помощью
deltadf = DeltaTable.forName(spark, f"{stageName}.{regName}")
Ошибка:
AnalysisException: `BASEsqlArea2`.`Country_users` is not a Delta table.
Когда я попытался создать таблицу Delta с помощью setupDeltaTable(stageName, regName)
AnalysisException: [RequestId=7df20209-dfa7-4e40-ba92-ed3162ba9dca ErrorClass=INVALID_PARAMETER_VALUE] GenerateTemporaryPathCredential uri /FileStore/tables/delta/BASEsqlArea2/Country_users is not a valid URI.
Error message: INVALID_PARAMETER_VALUE: Missing cloud file system scheme.
Я попробовал следующий подход: В hive_metastore:
from pyspark.sql import SparkSession
from delta.tables import *
databaseName = "hive_metastore.BASEsqlArea2"
spark.sql(f"CREATE DATABASE IF NOT EXISTS {databaseName}")
spark.sql(f"USE {databaseName}")
data = [("James", "Smith"), ("Anna", "Rose")]
columns = ["firstname", "lastname"]
df = spark.createDataFrame(data, columns)
def setupDeltaTable(stageName, regName):
fullTableName = f"{stageName}.{regName}"
if not DeltaTable.isDeltaTable(spark, f"delta.`{fullTableName}`"):
df.write.format("delta").mode("overwrite").saveAsTable(fullTableName)
print(f"Delta table created as {fullTableName}.")
else:
print(f"Delta table {fullTableName} already exists.")
stageName = "hive_metastore.BASEsqlArea2"
regName = "Country"
setupDeltaTable(stageName, regName)
deltadf = spark.read.table(f"{stageName}.{regName}")
display(deltadf)
Полученные результаты:

Привет @Dileep, большое спасибо за это. Однако как я могу изменить этот код так, чтобы он создавал базу данных в Hive_metastore со сценическим именем «BASEsqlArea2» и таблицей с regName «Country». ?
@Позвольте мне попробовать и обновить решение для вас.
@Patterson Я обновил решение. дайте мне знать, помогло ли это вам.
Ух ты! @Dileep, это был успех. Спасибо ооооооооооооооооо
stageName = "BASEsqlArea2" regName = "Country" chkDir = 'False' chkTbl = False, если chkDir == 'False' или chkTbl == False: setupDeltaTable(stageName, regName) deltadf = DeltaTable.forPath(spark, f"/FileStore/ table/delta/{stageName}/{regName}") deltadf.toDF().show()