2017-02-08 2 views
1

У нас есть JSON-х, которые содержат временные метки в формате:ADF не может разобрать DateTimeOffset

2016-11-03T03: 05: 21.673Z

2016-11-03T03: 05: 21.63Z

Так подходящий формат для анализа данных является YYYY-MM-DDThh: мм: 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" 
    }, 
    ... 
] 

Во всех этих случаях выше АПД завершается с ошибкой:

Copy activity encountered a user error at Sink side: ErrorCode=UserErrorInvalidDataValue,'Type=Microsoft.DataTransfer.Common.Shared.HybridDeliveryException,Message=Column 'data_event_time' contains an invalid value '2016-11-13T00:44:50.573Z'. Cannot convert '2016-11-13T00:44:50.573Z' to type 'DateTimeOffset' with format 'yyyy-MM-dd HH:mm:ss.fffffff zzz'.,Source=Microsoft.DataTransfer.Common,''Type=System.FormatException,Message=String was not recognized as a valid DateTime.,Source=mscorlib,'.

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

ответ

0

Мы смотрели на аналогичный вопрос недавно здесь:

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

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

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

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

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

  1. Скопируйте исходные файлы в хранилище больших двоичных объектов или Azure Data Озеро (теперь Polybase supports ADLS)
  2. Создание внешних таблиц более файлов, где данные даты и времени устанавливается в качестве VARCHAR типа данных
  3. CTAS данные во внутреннюю таблицу, а также преобразование формата строки DATETIME для правильного DATETIME с помощью T-SQL
+0

Big thanx. Оно работает. Но сбой на уровне назначения. – churupaha

+0

Какова цель или раковина? – wBob

+0

Цель Azure DWH. Я пытаюсь использовать параметр ADF для загрузки данных через PolyBase. Так поток данных выглядит следующим образом: SourceBlobStorage (JSONs) -> ADF -> StageBlobStorage (CSV) -> Polybase -> AzureDWH StageBlobStorage заполняется АПД. Объекты, связанные с PolyBase, создаются автоматически ADF. Кроме того, загрузка данных завершена с помощью АПД. Много внутренних скрытых работ. A отправил подробное описание с разметкой ADF выше (в качестве ответа на мой пост) – churupaha

1

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

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

Я пытаюсь загрузить данные из Azure Blob Storage в Azure DWH через 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": "..." 
     } 

Но процесс завершается с ошибкой:

Database operation failed. Error message from database execution : ErrorCode=FailedDbOperation,'Type=Microsoft.DataTransfer.Common.Shared.HybridDeliveryException,Message=Error happened when loading data into SQL Data Warehouse.,Source=Microsoft.DataTransfer.ClientLibrary,''Type=System.Data.SqlClient.SqlException,Message=107091;Query aborted-- the maximum reject threshold (10 %) was reached while reading from an external source: 6602 rows rejected out of total 6602 rows processed. Rows were rejected while reading from external source(s). 52168 rows rejected from external table [ADFCopyGeneratedExternalTable_0530887f-f870-4624-af46-249a39472bf3] in plan step 2 of query execution: Location: '/13/2cd1d10f-4f62-4983-a38d-685fc25c40a2_20161102_135850.blob' Column ordinal: 0, Expected data type: DATETIMEOFFSET(7) NOT NULL, Offending value: 2016-11-02T13:56:19.317Z (Column Conversion Error), Error: Conversion failed when converting the NVARCHAR value '2016-11-02T13:56:19.317Z' to data type DATETIMEOFFSET. Location: '/13/2cd1d10f-4f62-4983-a38d-685fc25c40a2_20161102_135850.blob' Column ordinal: 0, Expected ...

Я прочитал Azure SQL Data Warehouse loading patterns and strategies

If the DATE_FORMAT argument isn’t designated, the following default formats are used:

DateTime: ‘yyyy-MM-dd HH:mm:ss’

SmallDateTime: ‘yyyy-MM-dd HH:mm’

Date: ‘yyyy-MM-dd’

DateTime2: ‘yyyy-MM-dd HH:mm:ss’

DateTimeOffset: ‘yyyy-MM-dd HH:mm:ss’

Time: ‘HH:mm:ss’

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

Кто-нибудь знает обходное решение?

+0

Ответ обновлен с обходным решением. – wBob

+0

Я только начал использовать Data Factory с U-SQL и Azure SQL DW и имел эту точную проблему. Как вы отметили, SQL DW не любит очень много форматов даты и времени. Я изменил свой U-SQL-скрипт для использования пользовательского формата DateTime: ИСПОЛЬЗОВАНИЕ Outputters.Tsv (outputHeader: false, dateTimeFormat: "yyyy-MM-dd HH: mm: ss"); К сожалению, это означает, что вы потеряете любую информацию TZ, которая делает DateTimeOffset бесполезным. – JZimmerman

+0

yep, kinda закрытый круг. – churupaha

Смежные вопросы