You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Databricks向Azure Synapse写入数据时报JDBC查询执行失败如何解决

问题根因

你遇到的报错底层核心原因已在堆栈中明确给出:字符串或二进制数据会被截断,和你调整的连接配置无关,本质是待写入的DataFrame example1 中存在字段值长度超过Azure Synapse目标表SampleTable12对应字段的定义长度,导致Synapse拒绝写入数据。

排查解决步骤

  • 第一步:对比两侧字段长度
    首先查询Synapse侧SampleTable12的表结构,重点统计所有字符串类型(varchar、nvarchar、char等)字段的最大允许长度;再通过以下代码统计example1中所有字符串字段的实际最大长度:
    from pyspark.sql.functions import col, length, max
    for col_name, col_type in example1.dtypes:
        if col_type == 'string':
            max_length = example1.agg(max(length(col(col_name)))).collect()[0][0]
            print(f"字段{col_name}的实际最大长度:{max_length}")
    
  • 第二步:根据对比结果适配调整
    有两种可选解决方案:
    1. 扩展Synapse目标表对应字段长度:将长度不足的字段调整为更大的允许值,或直接设置为varchar(max)/nvarchar(max)
    2. 截断DataFrame超长字段:写入前将超长字段的值截取到目标表允许的最大长度,示例代码如下:
    from pyspark.sql.functions import substring
    # 假设col1字段最大允许长度为200,按实际情况修改字段名和长度
    example1 = example1.withColumn("col1", substring(col("col1"), 1, 200))
    
  • 第三步:排查多字节字符编码问题
    Databricks默认使用UTF-8编码,中文等多字节字符在Synapse中:varchar类型1个字符占3字节,nvarchar类型1个字符占2字节,若你使用varchar类型存储多字节字符,需按字节数计算长度,而非字符数。
  • 第四步:自动建表场景适配
    你使用了mode("overwrite"),若表不存在时会由Databricks自动创建,默认字符串字段映射长度可能不足,可在写入参数中添加配置指定最大字符串长度:
    example1.write.format("com.databricks.spark.sqldw")\
      .option("url", sqlDwUrlSmall)\
      .option("dbtable", "SampleTable12")\
      .option("forward_spark_azure_storage_credentials","True")\
      .option("tempdir", tempDir)\
      .option("maxStrLength", "4000") # 新增该行,按需求调整长度值
      .mode("overwrite").save()
    

内容的提问来源于stack exchange,提问作者Patterson

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.30 03:24:00