ADF не может проанализировать DateTimeOffset

У нас есть 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 'содержит недопустимое значение' 2016-11-13T00: 44: 50.573Z '. Невозможно преобразовать '2016-11-13T00: 44: 50.573Z' в тип 'DateTimeOffset' с форматом 'yyyy-MM-dd HH: mm: ss.fffffff zzz'., Source = Microsoft.DataTransfer.Common, '' Type = System.FormatException, Message = String не был распознан как допустимый DateTime., Source = mscorlib, '.

Что я делаю неправильно? Как это исправить?


person churupaha    schedule 08.02.2017    source источник


Ответы (2)


Предыдущая проблема исправлена. Спасибо wBob.

Но теперь у меня возникла новая проблема на уровне раковины.

Я пытаюсь загрузить данные из хранилища BLOB-объектов Azure в DWH Azure через ADF + PolyBase:

      "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; Query aborted - максимальный порог отклонения (10%) был достигнут при чтении из внешнего источника: отклонено 6602 строки из 6602 обработанных строк. Строки были отклонены при чтении из внешних источников. 52168 строк отклонено из внешней таблицы [ADFCopyGeneratedExternalTable_0530887f-f870-4624-af46-249a39472bf3] на этапе 2 плана выполнения запроса: Расположение: '/13/2cd1d10f-4f62-4983-a38d-685fc25c40a2_13161102 тип: 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, ожидается ...

Я прочитал Шаблоны и стратегии загрузки хранилища данных SQL Azure

Если аргумент DATE_FORMAT не указан, используются следующие форматы по умолчанию:

DateTime: ‘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’

Время: «ЧЧ: мм: сс»

Похоже, у меня нет возможности на уровне ADF указать формат даты и времени для PolyBase.

Кто-нибудь знает обходной путь?

person churupaha    schedule 08.02.2017
comment
Я только начал использовать фабрику данных с U-SQL и Azure SQL DW, и у меня возникла именно эта проблема. Как вы заметили, SQL DW не любит очень много форматов даты и времени. Я изменил свой сценарий U-SQL, чтобы использовать пользовательский формат DateTime: USING Outputters.Tsv (outputHeader: false, dateTimeFormat: yyyy-MM-dd HH: mm: ss); К сожалению, это означает, что вы потеряете любую информацию TZ, что сделает DateTimeOffset бесполезным. - person JZimmerman; 27.06.2017
comment
да, вроде замкнутый круг. - person churupaha; 04.07.2017

Недавно мы рассмотрели аналогичную проблему здесь:

Что переформатирует мои входные данные, прежде чем я получу к нему?

JSON не имеет формата Datetime как такового, поэтому оставьте элементы type и format. Тогда ваша задача - синхронизация. Например, вставка этих значений в базу данных SQL Azure должна сработать.

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

Глядя на ваше сообщение об ошибке, я ожидал, что сработает вставка в DATETIME столбец в хранилище данных SQL (или базу данных SQL или SQL Server на виртуальной машине), но это обычные DATETIME данные, а не DATETIMEOFFSET.

Если у вас возникли проблемы со вставкой в ​​целевой приемник, вам, возможно, придется решить эту проблему, не используя флажок Polybase и закодировав эту сторону процесса самостоятельно, например

  1. Скопируйте необработанные файлы в хранилище BLOB-объектов или в Azure Data Lake (теперь Polybase поддерживает ADLS)
  2. Создайте внешние таблицы над файлами, в которых данные datetime установлены как тип данных varchar
  3. CTAS данные во внутреннюю таблицу, а также преобразование строкового формата datetime в правильный DATETIME с помощью T-SQL
person wBob    schedule 08.02.2017
comment
Большое спасибо. Оно работает. Но терпит неудачу на уровне назначения. - person churupaha; 08.02.2017
comment
Какая цель / раковина? - person wBob; 08.02.2017
comment
Целью является Azure DWH. Я пытаюсь использовать опцию ADF для загрузки данных через PolyBase. Итак, поток данных выглядит так: SourceBlobStorage (JSON) - ›ADF -› StageBlobStorage (CSV) - ›Polybase -› AzureDWH StageBlobStorage заполняется ADF. Связанные с PolyBase объекты создаются автоматически ADF. Также завершающая загрузка данных инициируется ADF. Много внутренней скрытой работы. Выше разместил подробное описание с разметкой ADF (как ответ на мой пост) - person churupaha; 08.02.2017