将 VARCHAR 转换为 Datetime 并将 VARCHAR 转换为 Decimal 时创建外部表错误

Posted

技术标签:

【中文标题】将 VARCHAR 转换为 Datetime 并将 VARCHAR 转换为 Decimal 时创建外部表错误【英文标题】:Create External Table Error while converting VARCHAR to Datetime and VARCHAR to Decimal 【发布时间】:2021-11-04 18:48:43 【问题描述】:

我尝试从 CSV 文件(位于云存储中)创建外部表,在将 Varchar 转换为 datetime 并将 Varchar 转换为十进制时出错。有人可以帮我解决这个问题吗

错误信息

HdfsBridge::recordReaderFillBuffer - 填充记录读取器缓冲区时遇到意外错误:HadoopSqlException:将数据类型 VARCHAR 转换为 DECIMAL 时出错。

CREATE EXTERNAL TABLE [ext].[Load_History_test]
(   [Table_Name] [varchar](100) NULL,
    [Loaded_On] [datetime] NULL,
    [Transferred_Count] [decimal](30) NULL,
    [Transferred_Volume_MB] [decimal](30) NULL,
    [Load Duration] [time] NULL,
    [Throughput_Records] [decimal](30) NULL,
    [Throughput_Volume_KB_sec)] [decimal](30) NULL
)
WITH (DATA_SOURCE = [ADLS_External_Landing],LOCATION = N'/refdata/replicate/load_history',FILE_FORMAT = [CSVFileFormatwithHeaderloadhistory],REJECT_TYPE = VALUE,REJECT_VALUE = 0)
GO

CREATE EXTERNAL FILE FORMAT [CSVFileFormatwithHeaderloadhistory] WITH (FORMAT_TYPE = DELIMITEDTEXT, FORMAT_OPTIONS (FIELD_TERMINATOR = N',',

STRING_DELIMITER = N'0x22',
DATE_FORMAT = N'dd/MM/yyyy HH:mm:ss', 
FIRST_ROW = 2,
USE_TYPE_DEFAULT = FALSE))
GO

【问题讨论】:

您确定所有日期都在d/m/y 中吗?您确定没有任何行包含无效日期或无效小数或太多逗号或...请注意,导致问题的行可能不方便地位于屏幕截图中捕获的三行中。 谢谢亚伦,是的,有几行格式不合适。解决这个已解决的整个问题,谢谢 @user2703679,人们检查线程并浪费时间,因为您已经找到了解决方案。也许 Aaron 可以写他的评论作为你应该回答的答案,以便标记答案以关闭线程 【参考方案1】:

至少有一个日期不是d/m/y 格式,一位小数太大,或者一行或多行的逗号过多或过少导致格式无效。

请注意,导致问题的行可能不方便地位于屏幕截图中捕获的三行中。

【讨论】:

以上是关于将 VARCHAR 转换为 Datetime 并将 VARCHAR 转换为 Decimal 时创建外部表错误的主要内容,如果未能解决你的问题,请参考以下文章

如何将 DateTime 转换为 VarChar

完全按原样将 Datetime 转换为 Varchar

将 varchar 转换为 datetime 并添加秒

将 varchar 转换为 datetime 以对日期进行排序?

将 varchar 数据类型转换为 datetime 数据类型导致值超出范围的问题

Polybase - 将数据类型 VARCHAR 转换为 DATETIME 时出错