Сложные типы данных

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

В отличие от них, встроенные типы и типы, определяемые пользователем, являются самодостаточными (инкапсулированными) типами данных. Следовательно, единственный способ доступа к значениям компонентов непрозрачного типа данных — это функции, которые вы определяете для непрозрачного типа.

На следующем рисунке показаны сложные типы данных, которые поддерживает IBM® Informix®, и синтаксис, который вы используете для создания сложных типов данных.

Рисунок 1. Сложные типы данных

Сложные типы данных, которые показаны на предыдущем рисунке, обеспечивают поддержку следующих расширенных типов данных:

Типы коллекций

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

Типы строк

Тип строки обычно содержит несколько полей. Когда вы хотите хранить более одного вида данных в столбце или переменной, вы можете создать тип строки. Типы строк бывают двух видов: именованные типы строк и неименованные типы строк. Неименованный тип строки можно присвоить столбцам и переменным. Именованный тип строки можно присвоить столбцам, переменным, таблицам или представлениям. Когда таблице присваивается именованный тип строки, таблица является типизированной. Основное преимущество типизированных таблиц заключается в том, что их можно использовать для определения иерархии наследования.

Сложный тип данных — это тип данных преобразования, который представляет несколько значений данных в одной позиции столбца. Значения данных называются элементами. Элементы в сложном типе данных могут быть примитивными или сложными типами данных. Используйте сложные типы данных для обработки иерархических данных в связках, которые выполняются на движке Spark.

Трансформационные типы данных включают следующие типы данных:

Сложный тип данных

описание

Массив

Массив — это упорядоченная коллекция элементов.

Элементы могут быть примитивного или сложного типа данных. Все элементы в массиве должны быть одного типа данных.

Карта

Карта — это неупорядоченная коллекция элементов пары ключ-значение.

Ключ должен быть примитивным типом данных. Значение может быть примитивным или сложным типом данных.

Структура

Структура — это набор элементов различных типов данных.

Элементы могут быть примитивными или сложными типами данных. Структура имеет схему, которая определяет структуру данных.

Примивный тип данных

Тип данных преобразования, который представляет одно значение данных в одной позиции столбца. Такие типы данных, как десятичный, целочисленный и строковый, являются примитивными типами данных. Примитивные типы данных можно назначать портам в любой трансформации.

Сложный тип данных

Тип данных преобразования, который представляет несколько значений данных в одной позиции столбца. Такие типы данных, как array, map и struct, относятся к сложным типам данных. Вы можете назначать сложные типы данных портам в некоторых преобразованиях для движка Spark.

Вложенный тип данных

Сложный тип данных, который содержит элементы сложных типов данных. Такие сложные типы данных, как массив структур или структура с массивом других структур, являются вложенными типами данных.

Порты emp_name и emp_sal являются примитивными типами данных. Порты emp_phone, emp_id_dept и emp_address относятся к сложным типам данных. Порт emp_bonus имеет вложенный тип данных. Массив содержит элементы типа struct.

Обзор сложных типов данных

Под сложным типом данных мы понимаем одну из следующих структур:

Массив — Группа именованных полей, где каждое поле может иметь различный тип данных, как примитивный, так и сложный.

Структура — Список значений, имеющих один и тот же тип данных.

КАРТА — Набор пар (ключ, значение).

Элементы ARRAY или MAP, или поля STRUCT могут быть примитивными, а могут быть и другими сложными типами. Вы можете создавать сложные структуры данных с большим количеством уровней, например, ARRAY с элементами STRUCT.

Внешний вид сложных типов данных

представляет сложные типы очень просто. Пользователи могут манипулировать отдельными компонентными полями сложных типов так же, как и полями примитивных типов данных: размещать их на полках визуального представления, как компонент выражения, как фильтр и так далее. Каждый уровень сложного типа данных может быть развернут, чтобы показать детали компонента, или свернут.

обрабатывает сложные типы как Dimensions, группируя отдельные элементы под сложным типом. Компоненты сложного типа нельзя переназначить в группу Measures, даже если они логически представляют собой измерения; однако их можно легко использовать в качестве измерений на визуальных полках, в фильтрах и так далее.

Поскольку мы поддерживаем встроенную обработку SQL, вам не нужно беспокоиться о сложностях генерации запросов для доступа к этим элементам.

Ограничения

Сложные типы данных имеют следующие ограничения на реализацию:

Поля Карта, Структура и Карта требуют наличия базовых таблиц или разделов, использующих формат файла Parquet.

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

Операция Вычислить статистику не работает для сложных типов данных.

Определение столбца для любого сложного типа, включая вложенные типы, может содержать не более 4000 символов.

Функция Импорт в набор данных не поддерживает файлы, содержащие сложные типы данных.

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

Рассмотрим внешние наборы данных, используемые для наполнения индекса Azure Cognitive Search, могут иметь различную форму. Иногда они включают иерархические или вложенные подструктуры. Примерами могут быть несколько адресов для одного клиента, несколько цветов и размеров для одного SKU, несколько авторов одной книги и так далее. В терминах моделирования такие структуры могут называться сложными, составными, композитными или агрегированными типами данных. В Azure Cognitive Search для этого понятия используется термин «сложный тип». В Azure Cognitive Search сложные типы моделируются с помощью сложных полей. Комплексное поле — это поле, содержащее дочерние элементы (подполя), которые могут быть любого типа данных, включая другие комплексные типы. Это работает так же, как структурированные типы данных в языке программирования.

Сложные поля представляют либо один объект в документе, либо массив объектов, в зависимости от типа данных. Поля типа Edm.ComplexType представляют одиночные объекты, а поля типа Collection(Edm.ComplexType) — массивы объектов.

Azure Cognitive Search изначально поддерживает сложные типы и коллекции. Эти типы позволяют моделировать практически любую структуру JSON в индексе Azure Cognitive Search. В предыдущих версиях API Azure Cognitive Search можно было импортировать только сплющенные наборы строк. В новой версии индекс теперь может более точно соответствовать исходным данным. Другими словами, если ваши исходные данные имеют сложные типы, ваш индекс также может иметь сложные типы.

Пример сложной структуры

Следующий документ JSON состоит из простых полей и сложных полей. Сложные поля, такие как Address и Rooms, имеют вложенные поля. Адрес имеет один набор значений для этих вложенных полей, поскольку это один объект в документе. Напротив, у Rooms есть несколько наборов значений для вложенных полей, по одному для каждого объекта в коллекции.

{

«HotelId»: «1»,

«HotelName»: «Secret Point Motel»,

«Description»: «Ideally located on the main commercial artery of the city in the heart of New York.»,

«Tags»: [«Free wifi», «on-site parking», «indoor pool», «continental breakfast»],

«Address»: {

«StreetAddress»: «677 5th Ave»,

«City»: «New York»,

«StateProvince»: «NY»

},

«Rooms»: [

{

«Description»: «Budget Room, 1 Queen Bed (Cityside)»,

«RoomNumber»: 1105,

«BaseRate»: 96.99,

},

{

«Description»: «Deluxe Room, 2 Double Beds (City View)»,

«Type»: «Deluxe Room»,

«BaseRate»: 150.99,

}

. . .

]

}

Индексирование сложных типов

При индексировании вы можете иметь не более 3000 элементов во всех сложных коллекциях в одном документе. Элемент сложной коллекции является членом этой коллекции, поэтому в случае с Rooms (единственная сложная коллекция в примере с Hotel) каждый номер является элементом. В приведенном выше примере, если бы «Secret Point Motel» имел 500 номеров, документ отеля имел бы 500 элементов номеров. Для вложенных сложных коллекций каждый вложенный элемент также учитывается в дополнение к внешнему (родительскому) элементу.

Структурные обновления определения

Вы можете в любое время добавить новые подполя к сложному полю без необходимости перестройки индекса. Например, добавление «ZipCode» к Address или «Amenities» к Rooms разрешено, как и добавление поля верхнего уровня в индекс. Существующие документы имеют нулевое значение для новых полей, пока вы явно не заполните эти поля путем обновления данных.

Обратите внимание, что внутри сложного типа каждое подполе имеет тип и может иметь атрибуты, как и поля верхнего уровня.

Обновление данных

Обновление существующих документов в индексе с помощью действия upload работает одинаково для сложных и простых полей — все поля заменяются. Однако слияние (или mergeOrUpload при применении к существующему документу) не работает одинаково для всех полей. В частности, merge не поддерживает объединение элементов внутри коллекции. Это ограничение существует для коллекций примитивных типов и сложных коллекций. Чтобы обновить коллекцию, необходимо получить полное значение коллекции, внести изменения, а затем включить новую коллекцию в запрос Index API.

Сортировка сложных полей

Операции сортировки применяются к документам (Отели), а не к поддокументам (Номера). Когда у вас есть коллекция сложного типа, такая как Rooms, важно понимать, что вы не можете сортировать Rooms вообще. На самом деле, вы не можете сортировать ни одну коллекцию.

Операции сортировки работают, когда поля имеют единственное значение для каждого документа, независимо от того, является ли поле простым полем или подполем в сложном типе. Например, Address/City может быть отсортировано, поскольку для каждого отеля существует только один адрес, поэтому $orderby=Address/City будет сортировать отели по городам.

В этом примере элемент userid создается и используется локально, в то время как элемент password ссылается на предыдущее глобальное объявление элемента. Использование элементов и атрибутов локально или глобально связано с тем, насколько они ценны вне конкретного контекста; если элемент или атрибут используется только в одном месте, то лучше упростить ситуацию и оставить его локальным. В противном случае следует сделать его глобальным компонентом, а затем ссылаться на него везде, где он необходим, с помощью атрибута ref.

Разница между локальными и глобальными элементами связана с тем, как они создаются, что определяет, как вы можете их использовать. Элемент (userid в предыдущем примере), объявленный внутри другого элемента, считается локальным для этого элемента и может быть использован только в нем. Глобальный элемент (password в предыдущем примере) объявляется сам по себе и на него можно ссылаться из любого другого элемента.

Библиотека

  1. https://rusteon.ru/lecture/26
  2. https://studfile.net/preview/7481849/page:4/
  3. https://prog-cpp.ru/c-struct/
  4. https://academy.yandex.ru/handbook/cpp/article/complex-data-types
  5. https://cpct.sibsutis.ru/~artpol/downloads/prog/2012_2013/s2/prog_s2_lect3_v3.pdf

Leave a Comment

49 + = 53