U-SQL 从 BCP CSV 文件中提取错误

U-SQL Error Extracting from BCP CSV File

我有使用 BCP 从 SQL 服务器提取的数据,文件是 ASCII CSV。
2016-03-03T23:00:00 格式的日期。

当 运行 我得到的提取物

附加信息:

{"diagnosticCode":195887127,"severity":"Error","component":"RUNTIME","source":"User","errorId":"E_RUNTIME_USER_EXTRACT_COLUMN_CONVERSION_INVALID_ERROR","message":"Invalid character when attempting to convert column data.","description":"HEX: \"223022\" Invalid character when converting input record.\nPosition: line 1, column 21.","resolution":"Check the input for errors or use \"silent\" switch to ignore over(under)-sized rows in the input.\nConsider that ignoring \"invalid\" rows may influence job results and that types have to be nullable for conversion errors to be ignored.","helpLink":"","details":"============================================================================================\nHEX:5432333B35313B34362D323031362E30332E30335432333B30303B30302D302D352D323031362E30332E30335432333B35313B34392F3536372D302D323031362E30332E3033\n ^\nTEXT:T23:51:46,2016-03-03T23:00:00,0,5,2016-03-03T23:51:49.567,0,2016-03-03\n

提取时如何正确处理日期?我不清楚为什么它在日期时间列的中间拆分。

样本行看起来像

50CA2FBB-95C3-4216-A729-999BE2DB491A,2016-03-03T23:51:49.567,100146464881,1001464795,10014795,0000000000000000000000000000000000-00000000-00000000-000000-00000000-000000-000000-000000-000000-00000000-000000000000来,100 ,100 , ,12643,bCAwvRnNVwrKDXKxZkVed2Z1zHY=,o2lsnhueDApmvSbm31mh3aetYnc=,2016-03-03T23:50:46,2016-03-03T23:00:00,2016-03-03:T263:263:501 00:00,0,5,2016-03-03T23:51:49.567,0,2016-03-03T00:00:00,2016-03-03T23:59:59,00000000-0000-0000-0000-000000000000

Extract Statement is
@res =
EXTRACT 
        LicenseId Guid,
        EntryDate DateTime,
        UltimateId long,
        SiteId string,
        VirtualId string,
        ProjectId Guid,
        DocumentId Guid,
        MasterId string,
        ProductId string,
        FeatureString string,
        VersionId long,
        ComputerSid string,
        UserSid string,
        AppStartTime DateTime,
        StartHour DateTime,
        AppStopTime DateTime,
        StopHour DateTime,
        GmtDelta int,
        RecordedGmtDelta int,
        LastUpdated DateTime,
        Processed bool,
        StartDate DateTime,
        EndDate DateTime,
        ImsId Guid
FROM @dataFile
USING Extractors.Csv();

内置提取器的默认编码是 Encoding.UTF-8。所以很可能,您看到的三字节序列被解释为 UTF-8 而不是 ASCII。

如果您的 BCP 输出确实仅包含 ASCII 范围 (0-127) 中的代码点(而不是 ANSI 8 位字符),您可以指定 Extractors.Csv(encoding:Encoding.[ASCII])(请注意 [] ASCII 以避开保留关键字规则)。

如果您的数据包含 ANSI 范围字符,则必须将 BCP 输出为 UTF-16(我认为 BCP 不支持 UTF-8),或者将 BCP 的结果转换为 UTF-8。

请注意,如果文件大于 250MB,如果文件采用 UTF-16 编码,我们目前在上传文件时在记录边界检测方面存在错误。在我们修复此错误之前,我建议您在这种情况下上传使用 UTF-8 编码的文件。

此外,如果您需要支持完整的 ANSI 代码页,请在 https://feedback.azure.com/forums/327234-data-lake/suggestions/13077555-add-ansi-code-page-support-for-built-in-extractors 投票支持用户语音项目并提供您需要支持的代码页(例如,Windows -1254 或 ISO-Latin-1).