首页 > 解决方案 > Polybase - 将数据类型 VARCHAR 转换为 DATETIME 时出错

问题描述

我正在尝试为存储在 Azure 存储中的 CSV 文件创建一个外部表。

CSV 数据如下所示:-

日期 铁路时期 公历年 日历月 日历月份名称 财政年度 会计期间 平日 工作日编号
26/04/2021 2201 2021 4 四月 2022 第一期 周一 1
27/04/2021 2201 2021 4 四月 2022 第一期 周二 2
28/04/2021 2201 2021 4 四月 2022 第一期 周三 3
29/04/2021 2201 2021 4 四月 2022 第一期 周四 4
2021 年 4 月 30 日 2201 2021 4 四月 2022 第一期 星期五 5
2021 年 1 月 5 日 2201 2021 5 可能 2022 第 2 期 周六 6
2021 年 2 月 5 日 2202 2021 5 可能 2022 第 2 期 星期日 7
2021 年 3 月 5 日 2202 2021 5 可能 2022 第 2 期 周一 1
2021 年 4 月 5 日 2202 2021 5 可能 2022 第 2 期 周二 2

我使用以下代码创建了外部文件格式

CREATE EXTERNAL FILE FORMAT csvFile
WITH (
    FORMAT_TYPE = DELIMITEDTEXT,
    FORMAT_OPTIONS (
      FIELD_TERMINATOR = ',',
      STRING_DELIMITER = '"',
      FIRST_ROW = 2,
      USE_TYPE_DEFAULT = TRUE,
      ENCODING = 'UTF8' )
);

和外部表如下

CREATE EXTERNAL TABLE ext.DateDimension(
    [Date]                DATE, 
    [Rail Period]         INT, 
    [Calendar Year]       INT, 
    [Calendar Month]      INT,
    [Calendar Month Name] VARCHAR(9),
    [Fiscal Year]         INT, 
    [Fiscal Period]       VARCHAR(9), 
    [Weekday]             VARCHAR(9), 
    [Weekday Number]      INT)
WITH(
    DATA_SOURCE = [tfwpbstore_ADLSG2], 
    LOCATION = '/Generic Datasets/Date Dimension.csv',
    FILE_FORMAT = csvFile);

但是,当我尝试从外部表中选择时,它给了我以下错误

消息 107090,级别 16,状态 1,第 1 行 HdfsBridge::recordReaderFillBuffer - 填充记录读取器缓冲区时遇到意外错误:HadoopSqlException:将数据类型 VARCHAR 转换为 DATETIME 时出错。

而且我不太确定出了什么问题。如果有人可以提供帮助,我将不胜感激。

标签: sql-serverazure-synapsepolybase

解决方案


正如上面的评论中提到的,我需要定义文件格式语句中使用的日期格式,如下所示:

CREATE EXTERNAL FILE FORMAT csvFile_ddMMyyyy_fr2
WITH (
    FORMAT_TYPE = DELIMITEDTEXT,
    FORMAT_OPTIONS (
      FIELD_TERMINATOR = ',',
      STRING_DELIMITER = '"',
     DATE_FORMAT = 'dd/MM/yyyy',
      FIRST_ROW = 2,
      USE_TYPE_DEFAULT = TRUE,
      ENCODING = 'UTF8' )
);

推荐阅读