Azure Блоки данных в Azure SQL DW: длинные текстовые столбцы - PullRequest
2 голосов
/ 04 марта 2020

Я бы хотел заполнить 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 не удалось выполнить запрос JDB C, созданный соединителем.

Базовые исключения SQLException: - com.microsoft.sqlserver.jdb c .SQLServerException: HdfsBridge :: recordReaderFillBuffer - обнаружена непредвиденная ошибка при заполнении буфера считывателя записей: HadoopSqlException: строка или двоичные данные будут обрезаны. [ErrorCode = 107090] [SQLState = S0001]

Насколько я понимаю, это потому, что тип строки по умолчанию - NVARCHAR (256). Можно настроить ( ссылка ), но максимальная длина NVARCHAR составляет 4 000 символов. Мои строки иногда достигают 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 выполняются после вставки данных, и поэтому это также не удастся.

Есть идеи?

...