gpt4 book ai didi

pyspark - Azure Databricks 到 Azure SQL DW : Long text columns

转载 作者:行者123 更新时间:2023-12-03 19:16:11 25 4
gpt4 key购买 nike

我想从 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: An error occurred while calling o1252.save. : com.databricks.spark.sqldw.SqlDWSideException: SQL DW failed to execute the JDBC query produced by the connector.

Underlying SQLException(s): - com.microsoft.sqlserver.jdbc.SQLServerException: HdfsBridge::recordReaderFillBuffer - Unexpected error encountered filling record reader buffer: HadoopSqlException: String or binary data would be truncated. [ErrorCode = 107090] [SQLState = S0001]



据我了解,这是因为默认字符串类型是 NVARCHAR(256)。可以配置 ( reference ),但最大 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在插入数据后执行,因此这也会失败。

有任何想法吗?

最佳答案

我遇到了类似的问题,并且能够使用以下选项解决它:.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()
这是 documented here :
“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)
然后您可以像往常一样写入它,而无需 maxStrLength 选项。这也意味着您不会过度指定所有其他字符串列。
其他选择是:
  • 使用 split 将 1 列转换为多个字符串列。
  • 另存为 Parquet ,然后从突触内部加载
  • 关于pyspark - Azure Databricks 到 Azure SQL DW : Long text columns,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60521948/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com