【问题标题】:ADF cannot parse DateTimeOffsetADF 无法解析 DateTimeOffset
【发布时间】:2017-02-09 01:26:16
【问题描述】:

我们有 JSON 格式的时间戳:

2016-11-03T03:05:21.673Z

2016-11-03T03:05:21.63Z

所以解析数据的合适格式是yyyy-MM-ddTHH:mm:ss.FFF\Z

我尝试了所有这些变体来向 ADF 解释如何解析它:

"structure": [
  {
    "name": "data_event_time",
    "type": "DateTime",
    "format": "yyyy-MM-ddTHH:mm:ss.FFF\\Z"
  },
  ...
]

"structure": [
  {
    "name": "data_event_time",
    "type": "DateTimeOffset",
    "format": "yyyy-MM-ddTHH:mm:ss.FFFZ"
  },
  ...
]

"structure": [
  {
    "name": "data_event_time",
    "type": "DateTimeOffset"
  },
  ...
]

"structure": [
  {
    "name": "data_event_time",
    "type": "DateTime"
  },
  ...
]

在上述所有这些情况下,ADF 都失败并出现错误:

复制活动在接收器端遇到用户错误:ErrorCode=UserErrorInvalidDataValue,'Type=Microsoft.DataTransfer.Common.Shared.HybridDeliveryException,Message=Column 'data_event_time' contains an invalid value '2016-11-13T00:44:50.573 Z'。无法将“2016-11-13T00:44:50.573Z”转换为“yyyy-MM-dd HH:mm:ss.fffffff zzz”格式的“DateTimeOffset”。,Source=Microsoft.DataTransfer.Common,''Type= System.FormatException,Message=String 未被识别为有效的 DateTime.,Source=mscorlib,'。

我做错了什么?如何解决?

【问题讨论】:

    标签: azure-data-factory


    【解决方案1】:

    之前的问题已修复。谢谢 wBob。

    但是现在我在接收器级别遇到了一个新问题。

    我正在尝试通过 ADF + PolyBase 将数据从 Azure Blob 存储加载到 Azure DWH:

          "sink": {
            "type": "SqlDWSink",
            "sqlWriterCleanupScript": "$$Text.Format('DELETE FROM [stage].[events] WHERE data_event_time >= \\'{0:yyyy-MM-dd HH:mm}\\' AND data_event_time < \\'{1:yyyy-MM-dd HH:mm}\\'', WindowStart, WindowEnd)",
            "writeBatchSize": 6000000,
            "writeBatchTimeout": "00:15:00",
            "allowPolyBase": true,
            "polyBaseSettings": {
              "rejectType": "percentage",
              "rejectValue": 10.0,
              "rejectSampleValue": 100,
              "useTypeDefault": true
            }
          },
          "enableStaging": true,
          "stagingSettings": {
            "linkedServiceName": "AppInsight-Stage-BlobStorage-LinkedService"
          },
          "translator": {
            "type": "TabularTranslator",
            "columnMappings": "..."
          }
    

    但过程失败并出现错误:

    数据库操作失败。来自数据库执行的错误消息:ErrorCode=FailedDbOperation,'Type=Microsoft.DataTransfer.Common.Shared.HybridDeliveryException,Message=将数据加载到 SQL 数据仓库时发生错误。,Source=Microsoft.DataTransfer.ClientLibrary,''Type=System。 Data.SqlClient.SqlException,Message=107091;查询中止--从外部源读取时达到最大拒绝阈值 (10%):在处理的总共 6602 行中拒绝了 6602 行。从外部源读取时,行被拒绝。在查询执行的计划步骤 2 中,外部表 [ADFCopyGeneratedExternalTable_0530887f-f870-4624-af46-249a39472bf3] 拒绝了 52168 行:位置:'/13/2cd1d10f-4f62-4983-a38d-685fc25c40a2_20161102_13inalb 数据'或预期的blob 列'。类型:DATETIMEOFFSET(7) NOT NULL,违规值:2016-11-02T13:56:19.317Z(列转换错误),错误:将 NVARCHAR 值“2016-11-02T13:56:19.317Z”转换为数据类型 DATETIMEOFFSET。位置:'/13/2cd1d10f-4f62-4983-a38d-685fc25c40a2_20161102_135850.blob' 列序号:0,预期 ...

    我看了Azure SQL Data Warehouse loading patterns and strategies

    如果未指定 DATE_FORMAT 参数,则使用以下默认格式:

    日期时间:'yyyy-MM-dd HH:mm:ss'

    SmallDateTime: 'yyyy-MM-dd HH:mm'

    日期:'yyyy-MM-dd'

    DateTime2: 'yyyy-MM-dd HH:mm:ss'

    DateTimeOffset: 'yyyy-MM-dd HH:mm:ss'

    时间:'HH:mm:ss'

    看起来我无法在 ADF 级别为 PolyBase 指定日期时间格式。

    有人知道任何解决方法吗?

    【讨论】:

    • 我刚刚开始将数据工厂与 U-SQL 和 Azure SQL DW 一起使用,并遇到了这个确切的问题。正如您所指出的,SQL DW 不喜欢很多日期/时间格式。我修改了我的 U-SQL 脚本以使用自定义 DateTime 格式: USING Outputters.Tsv(outputHeader: false, dateTimeFormat: "yyyy-MM-dd HH:mm:ss");不幸的是,这意味着您将丢失任何使 DateTimeOffset 无用的 TZ 信息。
    • 是的,有点封闭的圈子。
    【解决方案2】:

    我们最近在这里看到了一个类似的问题:

    What's reformatting my input data before I get to it?

    JSON 本身没有 Datetime 格式,因此请不要使用 typeformat 元素。那么你的挑战就是同步。例如,将这些值插入 Azure SQL 数据库应该可以。

    "structure": [
      {
        "name": "data_event_time"
      },
      ...
    

    查看您的错误消息,我希望它可以插入 SQL 数据仓库(或 VM 上的 SQL 数据库或 SQL Server)中的 DATETIME 列,但它是普通的 DATETIME 数据,而不是 DATETIMEOFFSET .

    如果您在插入目标接收器时遇到问题,您可能不得不通过不使用 Polybase 复选框来解决问题,并自己编写流程的那一侧,例如

    1. 将原始文件复制到 Blob 存储或 Azure Data Lake(现为 Polybase supports ADLS
    2. 在日期时间数据设置为 varchar 数据类型的文件上创建外部表
    3. CTAS 将数据转换为内部表,同时使用 T-SQL 将字符串日期时间格式转换为正确的DATETIME

    【讨论】:

    • 感谢。有用。但在目标级别失败。
    • 目标/接收器是什么?
    • 目标是 Azure DWH。我正在尝试使用 ADF 的选项通过 PolyBase 加载数据。因此数据流如下所示: SourceBlobStorage (JSON)-->ADF-->StageBlobStorage(CSV)-->Polybase-->AzureDWH StageBlobStorage 由 ADF 填充。 PolyBase 相关对象由 ADF 自动创建。完成数据加载也是由 ADF 启动的。很多内部隐藏的工作。 A 在上面发布了带有 ADF 标记的详细描述(作为对我帖子的回答)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-08-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-19
    • 2019-10-20
    • 1970-01-01
    相关资源
    最近更新 更多