Databricks throwing error: truncating data

Databricks throwing error: truncating data

每当我尝试在 DW 上保存特定的 DataFrame 时,我都会收到消息:

ERROR: An error occurred while calling o692.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]

我检查了我的 csv 文件中字符串的大小。较大的有 38 个字符。

这是我的 save/write 方法(适用于其他 DataFrame):

df.write\
 .format('com.databricks.spark.sqldw') \
 .option('url', conn_string_dw) \
 .option('maxStrLength', '4000') \
 .option('forwardSparkAzureStorageCredentials', 'true') \
 .option('dbTable', db_table_name) \
 .option('tempDir', dw_temporary_path_url) \
 .option('truncate', 'False')\
 .mode('append')\
 .save()

这里可能发生了什么?

问题出在最终文件上。一个特定的单元格包含多行,导致了这个截断问题。

使用 Databricks 将表发送到 Synapse 时出现同样的错误。怀疑我的 spark Df 中的一个或多个字符串列超过了 256 NVARCHAR 默认长度。

  1. 运行 在我的数据块 df 上获取每个字符串列的最大长度。
import pandas as pd
df = df.toPandas()
dict([(v, df[v].apply(lambda r: len(str(r)) if r!=None else 0).max())for v in df.columns.values])
  1. 找到我的罪魁祸首。有一个最大长度为 416 的 col。

  2. 更改了我的 df.write Synapse 程序以包含 maxStrLength,如您所示