Фабрика данных Azure v2 - неправильное копирование года из паркета в базу данных SQL

У меня странная проблема с фабрикой данных Azure v2. Есть задание Spark, которое выполняется и создает файлы паркетов в качестве выходных данных, а действие копирования ADFv2 затем берет выходной паркет и копирует данные в базу данных SQL Azure. Все работает нормально кроме фиников! Когда данные попадают в SQL, истекает 1969 год. Итак, сегодняшняя дата (2018-11-22) будет как 3987-11-22.

Я пробовал изменить типы источника и назначения между Date, DateTime, DateTimeOffset и String, но безуспешно. На данный момент я исправляю даты в базе данных, но это не совсем идеально.

Я открыл исходные файлы паркета с помощью Parquet Viewer, Spark и Python (рабочий стол), и все они правильно показывают год как 2018.


person daz-fuller    schedule 22.11.2018    source источник


Ответы (2)


Согласно определению типа даты паркета, https://drill.apache.org/docs/parquet-format/#sql-types-to-parquet-logical-types Дата хранится как «количество дней с эпохи Unix, 1 января 1970 "

И ADF использует тип .net для преобразования. Согласно определению типа .net, значения времени измеряются в 100-наносекундных единицах, называемых тактами. Конкретная дата - это количество отметок с 12:00 до полуночи, 1 января 000 1 г. н.э. (CE) https://docs.microsoft.com/en-us/dotnet/api/system.datetime?view=netframework-4.7.2

Кажется, по этой причине добавлен дополнительный 1969 год. Но не уверен, что это ошибка. Какой у вас тип данных паркета? это Дата? а что такое тип данных sql? Не могли бы вы предоставить идентификатор запуска операции копирования? Или, может быть, какие-то образцы паркета?

person user10081545    schedule 24.11.2018
comment
Спасибо за это. Тип данных в DataFrame в Databricks - java.sql.Date, и он нацелен на поле DateTime в базе данных SQL. Я создал репо на github, которое содержит консольное приложение dotnetcore с использованием parquet.net, которое читает образец файла, созданный в Databricks. Он имеет поля java.sql.Date и java.sql.Timestamp. Файл parquet находится в репозитории, а в каталоге / media есть несколько снимков экрана из Python, Parquet Viewer, Databricks, ADF и вывода консольного приложения. github.com/dazfuller/adf-parquet-date-issue - person daz-fuller; 27.11.2018
comment
Привет @ daz-fuller, это известная проблема, и исправление сейчас развертывается. Это может занять пару дней. Повторите попытку позже, чтобы подтвердить, устранена ли проблема. - person user10081545; 29.11.2018
comment
Я только что заметил это вчера вечером, когда исправление SQL, которое я реализовал, переполнило тип :) Спасибо, что так быстро разрешили. - person daz-fuller; 29.11.2018

Основываясь на определениях кодировки паркета, формат Date, DateTime, DateTimeOffset and String не существует, поэтому вам не нужно пробовать эти форматы.

На основе этого Сопоставление типов данных для файлов Parquet в фабрике данных Azure:

введите здесь описание изображения

Формат DateTimeOffset соответствует формату Int96, я предлагаю вам попробовать эту передачу на исходном файле parquet.

person Jay Gong    schedule 26.11.2018
comment
Паркет в этом примере не может измениться, а Int96 не подходит для набора данных. Изменение типа набора данных на Timespan даст наиболее близкое приближение к базовому значению. - person daz-fuller; 27.11.2018