【问题标题】:Databricks throwing error: truncating dataDatabricks 抛出错误:截断数据
【发布时间】:2020-07-27 10:04:16
【问题描述】:

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

错误:调用 o692.save 时出错。 :com.databricks.spark.sqldw.SqlDWSideException:SQL DW 无法执行连接器生成的 JDBC 查询。 基础 SQLException(s): - com.microsoft.sqlserver.jdbc.SQLServerException: HdfsBridge::recordReaderFillBuffer - 遇到意外错误 填充记录读取器缓冲区:HadoopSqlException:字符串或二进制 数据将被截断。 [错误代码 = 107090] [SQLState = S0001]

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

这是我的保存/写入方法(适用于其他 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()

这里会发生什么?

【问题讨论】:

  • 请问您的目标表规格是什么?我的第一个检查是数据文件与列数据类型匹配。

标签: sql hadoop databricks azure-sqldw truncated


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    使用 Databricks 将表发送到 Synapse 时出现同样的错误。怀疑我的 spark Df 中的一个或多个字符串 cols 超过了 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. 找到我的罪魁祸首。有一个最大 len 为 416 的 col。

    2. 将 Synapse 的 df.write 程序更改为包含您所显示的 maxStrLength

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多