cas*_*sen 6 pyspark azure-databricks azure-synapse
我想从 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()
Run Code Online (Sandbox Code Playgroud)
这工作正常,但是当我包含内容足够长的字符串列时,我会收到错误。我收到以下错误:
Py4JJavaError:调用 o1252.save 时发生错误。:com.databricks.spark.sqldw.SqlDWSideException:SQL DW 无法执行连接器生成的 JDBC 查询。
底层 SQLException: - 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()
Run Code Online (Sandbox Code Playgroud)
另外,postActions在插入数据后执行,因此也会失败。
有任何想法吗?
我遇到了类似的问题,并且能够使用以下选项解决它:
.option("maxStrLength",4000)
因此,在您的示例中,这将是:
sdf.write \
.format("com.databricks.spark.sqldw") \
.option("forwardSparkAzureStorageCredentials", "true") \
.option("dbTable", "test_table") \
.option("maxStrLength",4000)\
.option("url", url) \
.option("tempDir", temp_dir) \
.save()
Run Code Online (Sandbox Code Playgroud)
这记录在这里:
“Spark 中的 StringType 映射到 Azure Synapse 中的 NVARCHAR(maxStrLength) 类型。您可以使用 maxStrLength 为 Azure Synapse 中名称为 dbTable 的表中的所有 NVARCHAR(maxStrLength) 类型列设置字符串长度。”
如果您的琴弦超过 4k 那么您应该:
使用 NVARCHAR(MAX) 预定义表列,然后以追加模式写入表。在这种情况下,您无法使用默认列存储索引,因此请使用 HEAP 或设置适当的索引。惰性堆是:
CREATE TABLE example.table
(
NormalColumn NVARCHAR(256),
LongColumn NVARCHAR(4000),
VeryLongColumn NVARCHAR(MAX)
)
WITH (HEAP)
Run Code Online (Sandbox Code Playgroud)
然后您可以照常写入,无需使用 maxStrLength 选项。这也意味着您不会过度指定所有其他字符串列。
其他选项是:
| 归档时间: |
|
| 查看次数: |
3783 次 |
| 最近记录: |