Я хочу заполнить Azure SQL DW из среды записной книжки Azure Databricks. Я использую встроенный коннектор с pyspark:
sdf.write \
.format("com.databricks.spark.sqldw") \
.option("forwardSparkAzureStorageCredentials", "true") \
.option("dbTable", "test_table") \
.option("url", url) \
.option("tempDir", temp_dir) \
.save()
Это работает нормально, но я получаю сообщение об ошибке, когда включаю строковый столбец с достаточно длинным содержимым. Я получаю следующую ошибку:
Py4JJavaError: ошибка при вызове o1252.save. : com.databricks.spark.sqldw.SqlDWSideException: SQL DW не удалось выполнить запрос JDBC, созданный соединителем.
Базовые исключения SQLException: - com.microsoft.sqlserver.jdbc.SQLServerException: HdfsBridge :: recordReaderFillBuffer - Произошла непредвиденная ошибка при заполнении буфера чтения записи: HadoopSqlException: строка или двоичные данные будут усечены. [ErrorCode = 107090] [SQLState = S0001]
Насколько я понимаю, это потому, что тип строки по умолчанию - NVARCHAR (256). Можно настроить (ссылка) , но максимальная длина NVARCHAR составляет 4 КБ символов. Мои строки иногда достигают 10 тысяч символов. Поэтому мне любопытно, как я могу вместо этого экспортировать определенные столбцы как текст / длинный текст.
Я предполагаю, что следующее будет работать, если только preActions
будут выполнены после создания таблицы. Это не так, и поэтому он терпит неудачу.
sdf.write \
.format("com.databricks.spark.sqldw") \
.option("forwardSparkAzureStorageCredentials", "true") \
.option("dbTable", "test_table") \
.option("url", url) \
.option("tempDir", temp_dir) \
.option("preActions", "ALTER TABLE test_table ALTER COLUMN value NVARCHAR(MAX);") \
.save()
Кроме того, postActions
выполняются после вставки данных, поэтому это также не сработает.
Любые идеи?