Как указать типы CosmosDb Synapse Link, если тип паркета неверен?

У меня есть связанная рабочая область CosmosDb и Synapse. Почти все работает с использованием Synapse для создания SQL-представлений для данных Cosmos.

В Cosmos у меня есть один набор данных со свойством, которое всегда равно нулю. Я знаю, что на самом деле это десятичная дробь, потому что это цена, а будущие данные, вероятно, будут содержать десятичные цены.

В Synapse мне нужно проецировать эти данные в представление SQL, где этот столбец является правильным десятичным числом (19,4).

Когда я запускаю запрос OpenRowSet к данным Cosmos и пытаюсь указать тип для этого свойства, я получаю следующую ошибку.

select *
from OPENROWSET(
    'CosmosDb',
    'account=myaccount;database=myDatabase;region=theRegion;key=xxxxxxxxxxxxxxx',
    [myCollection])
    with (
    [salesPrice] float '$.salesPrice')
as testQuery

Я получаю сообщение об ошибке:

Column 'salesPrice' of type 'FLOAT' is not compatible with external data type 'Parquet physical type: INT64', please try with 'BIGINT'.

Очевидно, что BIGINT здесь потерпит неудачу, как только я получу истинную десятичную цену.

Я думаю, что тип паркета устанавливается на BIGINT, потому что в Cosmos все значения для этого столбца равны нулю. Я предполагаю, что в более общем плане была бы та же проблема, если бы свойство Cosmos было целым числом, отличным от нуля.

Как я могу заставить тип salesPrice быть десятичным или плавающим?

(Я не хочу, чтобы здесь меня отслеживали по плавающей и десятичной дробям для денежных значений, я понимаю разницу; эта ошибка возникает в любом случае)

ОБНОВЛЯТЬ

Эта проблема проявляется и по-другому, без указания схемы с OPENROWSET.

В новую коллекцию CosmosDb вставьте такой документ, как:

{
   "myid" : 1,
   "price" : 0
}

Если я подожду минуту или около того, я могу запросить этот документ из Synapse с помощью:

select *
from OPENROWSET(
    'myCosmosDb',
    'account=myAccount;database=myDatabase;region=myRegion;key=xxxxxxxxxxxxxxxxxxx',
    [myCollection])
    as testQuery;

и я получаю ожидаемые результаты.

Теперь добавьте второй документ:

{
   "myid" : 1,
   "price" : 1.1
}

и повторите запрос, и я получаю ту же ошибку:

Column 'price' of type 'FLOAT' is not compatible with external data type 'Parquet physical type: INT64', please try with 'BIGINT'

Есть ли способ обойти или предотвратить подобные ошибки?

Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
0
804
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Как насчет установить документ как

{
   "myid" : "1",
   "price" : "1.1"
}

Данные не поступают из исходных систем в виде строк. Я предполагаю, что мы могли бы изменить все данные, поступающие в космос, на строки, но это не кажется очень удовлетворительным решением, равно как и заполнение коллекции в космосе явными типами. Проблема также может проявиться, если модели данных, поступающие в CosmosDb, изменились, и я хотел отредактировать схему паркета, чтобы отразить это изменение. Прямо сейчас я должен удалить всю коллекцию после резервного копирования данных, перезагрузить и перестроить в Synapse. У меня есть обращение в службу поддержки Azure по этому поводу, но без особых надежд.

robs 31.12.2020 12:37

Надеюсь, вы скоро решите это. В любом случае, я все же считаю, что изменение данных в строковом формате является наиболее удобным способом.

Tiny Wang 31.12.2020 14:12

Долгое время возвращались к этому, но в конце концов мы решили преобразовать все данные json в строки, а затем вернуть в Synapse правильные типы данных. Итак, наконец, принято! Как ни странно, аналогичная проблема возникла с требованием конвертировать json в csv. Учитывая, что json не должен постоянно отображать все свойства (в отличие от csv), легко могут возникнуть несоответствия, если результаты csv необходимо объединить с существующими файлами csv. Более того, нам нужно было разбить вложенные массивы на отдельные файлы csv. Для всего этого требуется какая-то схема.

robs 22.07.2022 12:05

Другие вопросы по теме