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 默认长度。
- 运行 在我的数据块 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])
找到我的罪魁祸首。有一个最大长度为 416 的 col。
更改了我的 df.write Synapse 程序以包含 maxStrLength,如您所示
每当我尝试在 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 默认长度。
- 运行 在我的数据块 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])
找到我的罪魁祸首。有一个最大长度为 416 的 col。
更改了我的 df.write Synapse 程序以包含 maxStrLength,如您所示