我想从 Azure Databricks 笔记本环境填充 Azure SQL DW。我正在使用带有 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(s): - com.microsoft.sqlserver.jdbc.SQLServerException:HdfsBridge::recordReaderFillBuffer - 填充记录读取器缓冲区时遇到意外错误:HadoopSqlException:字符串或二进制数据将被截断。[错误代码 = 107090] [SQLState = S0001]
据我了解,这是因为默认字符串类型是 NVARCHAR(256)。可以配置(参考),但最大 NVARCHAR 长度为 4k 个字符。我的字符串偶尔会达到 10k 个字符。因此,我很好奇如何将某些列导出为文本/长文本。
我猜想以下方法会起作用,如果只有在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
在插入数据后执行,因此这也会失败。
有任何想法吗?