Перейти к основному содержимому
Версия: 2.0.x

CREATE TABLE

Создает новую таблицу в Selena.

подсказка

Для выполнения этой операции требуется привилегия CREATE TABLE на целевой базе данных.

Синтаксис

CREATE [EXTERNAL] [TEMPORARY] TABLE [IF NOT EXISTS] [database.]table_name
(column_definition1[, column_definition2, ...]
[, index_definition1[, index_definition12,]])
[ENGINE = [olap|mysql|elasticsearch|hive|hudi|iceberg|jdbc]]
[key_desc]
[COMMENT "table comment"]
[partition_desc]
[distribution_desc]
[rollup_index]
[ORDER BY (column_name1,...)]
[PROPERTIES ("key"="value", ...)]
подсказка
  • Имя таблицы, имя partition, имя столбца и имя индекса, которые вы создаете, должны соответствовать соглашениям об именовании в Системных ограничениях.
  • При указании имени базы данных, имени таблицы, имени столбца или имени partition обратите внимание, что некоторые литералы используются как зарезервированные ключевые слова в Selena. Не используйте эти ключевые слова напрямую в SQL-выражениях. Если вы хотите использовать такое ключевое слово в SQL-выражении, заключите его в пару обратных кавычек (`). См. Ключевые слова для этих зарезервированных ключевых слов.

Ключевые слова

EXTERNAL

предупреждение

Ключевое слово EXTERNAL устарело.

Мы рекомендуем использовать внешние каталоги для запроса данных из источников данных Hive, Iceberg, Hudi и JDBC вместо использования ключевого слова EXTERNAL для создания внешних таблиц.

подсказка

Рекомендация

Начиная с v1.5.2, Selena поддерживает создание таблиц в формате Parquet в каталогах Iceberg и поддерживает загрузку данных в эти таблицы Iceberg в формате Parquet с помощью INSERT INTO.

Начиная с v1.5.2, Selena поддерживает создание таблиц в формате Parquet в каталогах Hive и поддерживает загрузку данных в эти таблицы Hive в формате Parquet с помощью INSERT INTO. Начиная с v1.5.2, Selena поддерживает создание таблиц в форматах ORC и Textfile в каталогах Hive и поддерживает загрузку данных в эти таблицы Hive в форматах ORC и Textfile с помощью INSERT INTO.

Если вы хотите использовать устаревшее ключевое слово EXTERNAL, разверните Детали ключевого слова EXTERNAL

Детали ключевого слова EXTERNAL

Чтобы создать внешнюю таблицу для запроса внешних источников данных, укажите CREATE EXTERNAL TABLE и установите ENGINE в одно из следующих значений. Для получения дополнительной информации вы можете обратиться к Внешним таблицам.

  • Для внешних таблиц MySQL укажите следующие свойства:

    PROPERTIES (
    "host" = "mysql_server_host",
    "port" = "mysql_server_port",
    "user" = "your_user_name",
    "password" = "your_password",
    "database" = "database_name",
    "table" = "table_name"
    )

    Примечание:

    "table_name" в MySQL должно указывать на реальное имя таблицы. В отличие от этого, "table_name" в выражении CREATE TABLE указывает имя этой таблицы MySQL в Selena. Они могут быть как разными, так и одинаковыми.

    Цель создания таблиц MySQL в Selena — получить доступ к базе данных MySQL. Selena сама не поддерживает и не хранит никаких данных MySQL.

  • Для внешних таблиц Elasticsearch укажите следующие свойства:

    PROPERTIES (
    "hosts" = "http://192.168.xx.xx:8200,http://192.168.xx0.xx:8200",
    "user" = "root",
    "password" = "root",
    "index" = "tindex",
    "type" = "doc"
    )
    • hosts: URL-адрес, который используется для подключения к вашему кластеру Elasticsearch. Вы можете указать один или несколько URL-адресов.
    • user: учетная запись root пользователя, которая используется для входа в ваш кластер Elasticsearch с включенной базовой аутентификацией.
    • password: пароль предыдущей учетной записи root.
    • index: индекс таблицы Selena в вашем кластере Elasticsearch. Имя индекса совпадает с именем таблицы Selena. Вы можете установить этот параметр на псевдоним таблицы Selena.
    • type: тип индекса. Значение по умолчанию — doc.
  • Для внешних таблиц Hive укажите следующие свойства:

    PROPERTIES (
    "database" = "hive_db_name",
    "table" = "hive_table_name",
    "hive.metastore.uris" = "thrift://xx.xx.xx.xx:9083"
    )

    Здесь database — это имя соответствующей базы данных в таблице Hive. Table — это имя таблицы Hive. hive.metastore.uris — это адрес сервера.

  • Для внешних таблиц JDBC укажите следующие свойства:

    PROPERTIES (
    "resource"="jdbc0",
    "table"="dest_tbl"
    )

    resource — это имя ресурса JDBC, а table — это целевая таблица.

  • Для внешних таблиц Iceberg укажите следующие свойства:

     PROPERTIES (
    "resource" = "iceberg0",
    "database" = "iceberg",
    "table" = "iceberg_table"
    )

    resource — это имя ресурса Iceberg. database — это база данных Iceberg. table — это таблица Iceberg.

  • Для внешних таблиц Hudi укажите следующие свойства:

      PROPERTIES (
    "resource" = "hudi0",
    "database" = "hudi",
    "table" = "hudi_table"
    )

TEMPORARY

Создает временную таблицу. Начиная с v1.5.2, Selena поддерживает создание временных таблиц в Default Catalog. Для получения дополнительной информации см. Временная таблица.

примечание

При создании временной таблицы необходимо установить ENGINE в olap.

Определение столбцов

col_name col_type [agg_type] [NULL | NOT NULL] [DEFAULT "default_value"] [AUTO_INCREMENT] [AS generation_expr]

col_name

Обратите внимание, что обычно вы не можете создать столбец, имя которого начинается с __op или __row, потому что эти форматы имен зарезервированы для специальных целей в Selena, и создание таких столбцов может привести к неопределенному поведению. Если вам действительно нужно создать такой столбец, установите динамический параметр FE allow_system_reserved_names в TRUE.

col_type

Конкретная информация о столбце, такая как типы и диапазоны:

  • TINYINT (1 байт): Диапазон от -2^7 + 1 до 2^7 - 1.

  • SMALLINT (2 байта): Диапазон от -2^15 + 1 до 2^15 - 1.

  • INT (4 байта): Диапазон от -2^31 + 1 до 2^31 - 1.

  • BIGINT (8 байт): Диапазон от -2^63 + 1 до 2^63 - 1.

  • LARGEINT (16 байт): Диапазон от -2^127 + 1 до 2^127 - 1.

  • FLOAT (4 байта): Поддерживает научную нотацию.

  • DOUBLE (8 байт): Поддерживает научную нотацию.

  • DECIMAL[(precision, scale)] (16 байт)

    • Значение по умолчанию: DECIMAL(10, 0)

    • precision: 1 ~ 38

    • scale: 0 ~ precision

    • Целая часть: precision - scale

      Научная нотация не поддерживается.

  • DATE (3 байта): Диапазон от 0000-01-01 до 9999-12-31.

  • DATETIME (8 байт): Диапазон от 0000-01-01 00:00:00 до 9999-12-31 23:59:59.

  • CHAR[(length)]: Строка фиксированной длины. Диапазон: 1 ~ 255. Значение по умолчанию: 1.

  • VARCHAR[(length)]: Строка переменной длины. Значение по умолчанию — 1. Единица измерения: байты. В версиях до Selena 2.1 диапазон значений length составляет 1–65533. [Предварительная версия] В Selena 2.1 и более поздних версиях диапазон значений length составляет 1–1048576.

  • HLL (1~16385 байт): Для типа HLL нет необходимости указывать длину или значение по умолчанию. Длина будет контролироваться внутри системы в соответствии с агрегацией данных. Столбец HLL может быть запрошен или использован только с помощью hll_union_agg, Hll_cardinality и hll_hash.

  • BITMAP: Тип Bitmap не требует указания длины или значения по умолчанию. Он представляет собой набор беззнаковых чисел bigint. Самый большой элемент может достигать 2^64 - 1.

agg_type

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

  • SUM, MAX, MIN, REPLACE
  • HLL_UNION (только для типа HLL)
  • BITMAP_UNION (только для BITMAP)
  • REPLACE_IF_NOT_NULL: Это означает, что импортированные данные будут заменены только в том случае, если они имеют ненулевое значение. Если это нулевое значение, Selena сохранит исходное значение.
примечание
  • Когда столбец типа агрегации BITMAP_UNION импортируется, его исходные типы данных должны быть TINYINT, SMALLINT, INT и BIGINT.
  • Если NOT NULL указан для столбца REPLACE_IF_NOT_NULL при создании таблицы, Selena все равно преобразует данные в NULL, не отправляя сообщение об ошибке пользователю. Это позволяет пользователю импортировать выбранные столбцы.

Этот тип агрегации применяется ТОЛЬКО к таблице Aggregate, у которой тип key_desc — AGGREGATE KEY. Начиная с v1.5.2, REPLACE_IF_NOT_NULL поддерживает столбцы типа BITMAP.

NULL | NOT NULL: Разрешено ли столбцу быть NULL. По умолчанию NULL указывается для всех столбцов в таблице, использующей ключ Duplicate Key, Aggregate или Unique Key. В таблице, использующей ключ Primary Key, по умолчанию столбцы значений указываются с NULL, тогда как ключевые столбцы указываются с NOT NULL. Если в исходных данных содержатся значения NULL, представьте их с помощью \N. Selena обрабатывает \N как NULL во время загрузки данных.

DEFAULT "default_value": значение по умолчанию для столбца. Когда вы загружаете данные в Selena, если исходное поле, сопоставленное со столбцом, пустое, Selena автоматически заполняет значение по умолчанию в столбце. Вы можете указать значение по умолчанию одним из следующих способов:

  • DEFAULT current_timestamp: Используйте текущее время в качестве значения по умолчанию. Для получения дополнительной информации см. current_timestamp().
  • DEFAULT <default_value>: Используйте заданное значение типа данных столбца в качестве значения по умолчанию. Например, если тип данных столбца — VARCHAR, вы можете указать строку VARCHAR, например beijing, в качестве значения по умолчанию, как показано в DEFAULT "beijing". Обратите внимание, что значения по умолчанию не могут быть любого из следующих типов: ARRAY, BITMAP, JSON, HLL и BOOLEAN.
  • DEFAULT (<expr>): Используйте результат, возвращаемый заданной функцией, в качестве значения по умолчанию. Поддерживаются только выражения uuid() и uuid_numeric().

AUTO_INCREMENT: указывает столбец AUTO_INCREMENT. Типы данных столбцов AUTO_INCREMENT должны быть BIGINT. Автоинкрементные идентификаторы начинаются с 1 и увеличиваются с шагом 1. Для получения дополнительной информации о столбцах AUTO_INCREMENT см. AUTO_INCREMENT. Начиная с v1.5.2, Selena поддерживает столбцы AUTO_INCREMENT.

AS generation_expr: указывает вычисляемый столбец и его выражение. Вычисляемый столбец может использоваться для предварительного вычисления и хранения результатов выражений, что значительно ускоряет запросы с одинаковыми сложными выражениями. Начиная с v1.5.2, Selena поддерживает вычисляемые столбцы.

Определение индекса

INDEX index_name (col_name[, col_name, ...]) [USING BITMAP] COMMENT 'xxxxxx'

Для получения дополнительной информации об описаниях параметров и примечаниях по использованию см. Bitmap индексирование.

ENGINE

Значение по умолчанию: olap. Если этот параметр не указан, по умолчанию создается таблица OLAP (собственная таблица Selena).

Опциональные значения: mysql, elasticsearch, hive, jdbc, iceberg и hudi.

Ключ

Синтаксис:

key_type(k1[,k2 ...])

Данные упорядочиваются в указанных ключевых столбцах и имеют разные атрибуты для разных типов ключей:

  • AGGREGATE KEY: Идентичное содержимое в ключевых столбцах будет агрегировано в столбцы значений в соответствии с указанным типом агрегации. Обычно применяется в бизнес-сценариях, таких как финансовые отчеты и многомерный анализ.

  • UNIQUE KEY/PRIMARY KEY: Идентичное содержимое в ключевых столбцах будет заменено в столбцах значений в соответствии с последовательностью импорта. Может применяться для добавления, удаления, изменения и запроса по ключевым столбцам.

  • DUPLICATE KEY: Идентичное содержимое в ключевых столбцах, которое также существует в Selena одновременно. Может использоваться для хранения детальных данных или данных без атрибутов агрегации.

    примечание

    DUPLICATE KEY — это тип по умолчанию. Данные будут упорядочены в соответствии с ключевыми столбцами.

примечание

Столбцы значений не нужно указывать типы агрегации, когда другой key_type используется для создания таблиц, за исключением AGGREGATE KEY.

COMMENT

Вы можете добавить комментарий к таблице при её создании, опционально. Обратите внимание, что COMMENT должен быть размещён после key_desc. В противном случае таблица не может быть создана.

Начиная с v1.5.2, вы можете изменить комментарий к таблице с помощью ALTER TABLE <table_name> COMMENT = "new table comment".

Partition

Partition могут управляться следующими способами:

Динамическое создание partition

Динамическое разбиение на partition предоставляет управление временем жизни (TTL) для partition. Selena автоматически создает новые partition заранее и удаляет устаревшие partition для обеспечения свежести данных. Чтобы включить эту функцию, вы можете настроить свойства, связанные с динамическим разбиением на partition, при создании таблицы.

Создание partition по одному

Указать только верхнюю границу для partition

Синтаксис:

PARTITION BY RANGE ( <partitioning_column1> [, <partitioning_column2>, ... ] )
PARTITION <partition1_name> VALUES LESS THAN ("<upper_bound_for_partitioning_column1>" [ , "<upper_bound_for_partitioning_column2>", ... ] )
[ ,
PARTITION <partition2_name> VALUES LESS THAN ("<upper_bound_for_partitioning_column1>" [ , "<upper_bound_for_partitioning_column2>", ... ] )
, ... ]
)
примечание

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

  • Для соглашений об именовании partition см. Системные ограничения.

  • До v1.5.2 столбцы для разбиения на partition по диапазону поддерживают только следующие типы: TINYINT, SMALLINT, INT, BIGINT, LARGEINT, DATE и DATETIME. Начиная с v1.5.2, три специальные функции времени могут использоваться в качестве столбцов для разбиения на partition по диапазону. Для подробного использования см. Распределение данных.

  • Partition являются левозамкнутыми и правооткрытыми. Левая граница первого partition имеет минимальное значение.

  • Значение NULL хранится только в partition, которые содержат минимальные значения. Когда partition, содержащий минимальное значение, удаляется, значения NULL больше не могут быть импортированы.

  • Столбцы partition могут быть как одним, так и несколькими столбцами. Значения partition являются минимальными значениями по умолчанию.

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

    PARTITION BY RANGE (pay_dt) (
    PARTITION p1 VALUES LESS THAN ("20210102"),
    PARTITION p2 VALUES LESS THAN ("20210103"),
    PARTITION p3 VALUES LESS THAN MAXVALUE
    )
примечание
  • Partition часто используются для управления данными, связанными со временем.
  • Когда требуется откат данных, вы можете захотеть рассмотреть очистку первого partition для добавления partition позже, когда это необходимо.

Указать как нижнюю, так и верхнюю границы для partition

Синтаксис:

PARTITION BY RANGE ( <partitioning_column1> [, <partitioning_column2>, ... ] )
(
PARTITION <partition_name1> VALUES [( "<lower_bound_for_partitioning_column1>" [ , "<lower_bound_for_partitioning_column2>", ... ] ), ( "<upper_bound_for_partitioning_column1?" [ , "<upper_bound_for_partitioning_column2>", ... ] ) )
[,
PARTITION <partition_name2> VALUES [( "<lower_bound_for_partitioning_column1>" [ , "<lower_bound_for_partitioning_column2>", ... ] ), ( "<upper_bound_for_partitioning_column1>" [ , "<upper_bound_for_partitioning_column2>", ... ] ) )
, ...]
)
примечание
  • Fixed Range более гибкий, чем LESS THAN. Вы можете настроить левую и правую partition.
  • Fixed Range такой же, как LESS THAN, в других аспектах.
  • Когда в качестве столбца разбиения на partition указан только один столбец, вы можете установить MAXVALUE в качестве верхней границы для столбца разбиения на partition последнего partition.
PARTITION BY RANGE (pay_dt) (
PARTITION p202101 VALUES [("20210101"), ("20210201")),
PARTITION p202102 VALUES [("20210201"), ("20210301")),
PARTITION p202103 VALUES [("20210301"), (MAXVALUE))
)

Создание нескольких partition пакетно

Синтаксис

  • Если столбец разбиения на partition имеет тип даты.

    PARTITION BY RANGE (<partitioning_column>) (
    START ("<start_date>") END ("<end_date>") EVERY (INTERVAL <N> <time_unit>)
    )
  • Если столбец разбиения на partition имеет целочисленный тип.

    PARTITION BY RANGE (<partitioning_column>) (
    START ("<start_integer>") END ("<end_integer>") EVERY (<partitioning_granularity>)
    )

Описание

Вы можете указать начальные и конечные значения в START() и END() и единицу времени или гранулярность разбиения на partition в EVERY() для создания нескольких partition пакетно.

  • До v1.5.2 столбцы для разбиения на partition по диапазону поддерживают только следующие типы: TINYINT, SMALLINT, INT, BIGINT, LARGEINT, DATE и DATETIME. Начиная с v1.5.2, три специальные функции времени могут использоваться в качестве столбцов для разбиения на partition по диапазону. Для подробного использования см. Распределение данных.
  • Если столбец разбиения на partition имеет тип даты, вам нужно использовать ключевое слово INTERVAL для указания интервала времени. Вы можете указать единицу времени как hour (начиная с v1.5.2), day, week, month или year. Соглашения об именовании partition такие же, как и для динамических partition.

Для получения дополнительной информации см. Распределение данных.

Распределение

Selena поддерживает hash bucketing и random bucketing. Если вы не настроите bucketing, Selena использует random bucketing и автоматически устанавливает количество bucket'ов по умолчанию.

  • Random bucketing (начиная с v1.5.2)

    Для данных в partition Selena распределяет данные случайным образом по всем bucket'ам, что не основано на конкретных значениях столбцов. И если вы хотите, чтобы Selena автоматически устанавливала количество bucket'ов, вам не нужно указывать какие-либо конфигурации bucketing. Если вы решите вручную указать количество bucket'ов, синтаксис следующий:

    DISTRIBUTED BY RANDOM BUCKETS <num>

    Однако обратите внимание, что производительность запросов, обеспечиваемая random bucketing, может быть не идеальной при запросе больших объемов данных и частом использовании определенных столбцов в качестве условных столбцов. В этом сценарии рекомендуется использовать hash bucketing. Поскольку нужно сканировать и вычислять только небольшое количество bucket'ов, это значительно улучшает производительность запросов.

    Меры предосторожности

    • Вы можете использовать random bucketing только для создания таблиц Duplicate Key.
    • Вы не можете указать Colocation Group для таблицы с random bucketing.
    • Spark Load нельзя использовать для загрузки данных в таблицы с random bucketing.
    • Начиная с Selena v1.5.2, вам не нужно устанавливать количество bucket'ов при создании таблицы. Selena автоматически устанавливает количество bucket'ов. Если вы хотите установить этот параметр, см. Установить количество bucket'ов.

    Для получения дополнительной информации см. Random bucketing.

  • Hash bucketing

    Синтаксис:

    DISTRIBUTED BY HASH (k1[,k2 ...]) [BUCKETS num]

    Данные в partition могут быть подразделены на bucket'ы на основе хеш-значений столбцов bucketing и количества bucket'ов. Мы рекомендуем выбирать столбец, который соответствует следующим двум требованиям, в качестве столбца bucketing.

    • Столбец с высокой кардинальностью, такой как ID
    • Столбец, который часто используется в качестве фильтра в запросах

    Если такого столбца не существует, вы можете определить столбец bucketing в соответствии со сложностью запросов.

    • Если запрос сложный, мы рекомендуем выбирать столбец с высокой кардинальностью в качестве столбца bucketing, чтобы обеспечить сбалансированное распределение данных между bucket'ами и улучшить использование ресурсов кластера.
    • Если запрос относительно простой, мы рекомендуем выбирать столбец, который часто используется в качестве условия запроса, в качестве столбца bucketing, чтобы повысить эффективность запросов.

    Если данные partition не могут быть равномерно распределены в каждый bucket с использованием одного столбца bucketing, вы можете выбрать несколько столбцов bucketing (максимум три). Для получения дополнительной информации см. Выбор столбцов bucketing.

    Меры предосторожности:

    • При создании таблицы вы должны указать столбцы bucketing.
    • Значения столбцов bucketing не могут быть обновлены.
    • Столбцы bucketing не могут быть изменены после их указания.
    • Начиная с Selena v1.5.2, вам не нужно устанавливать количество bucket'ов при создании таблицы. Selena автоматически устанавливает количество bucket'ов. Если вы хотите установить этот параметр, см. Установить количество bucket'ов.

Rollup индекс

Вы можете создавать rollup'ы пакетно при создании таблицы.

Синтаксис:

ROLLUP (rollup_name (column_name1, column_name2, ...)
[FROM from_index_name]
[PROPERTIES ("key"="value", ...)],...)

ORDER BY

Начиная с v1.5.2, таблицы Primary Key поддерживают определение ключей сортировки с помощью ORDER BY. Начиная с v1.5.2, таблицы Duplicate Key, таблицы Aggregate и таблицы Unique Key поддерживают определение ключей сортировки с помощью ORDER BY.

Для получения дополнительных описаний ключей сортировки см. Ключи сортировки и префиксные индексы.

PROPERTIES

Хранилище и реплики

Если тип engine — OLAP, вы можете указать начальный носитель хранения (storage_medium), автоматическое время охлаждения хранилища (storage_cooldown_time) или временной интервал (storage_cooldown_ttl), и количество реплик (replication_num) при создании таблицы.

Область действия свойств: Если таблица имеет только один partition, свойства принадлежат таблице. Если таблица разделена на несколько partition, свойства принадлежат каждому partition. И когда вам нужно настроить различные свойства для указанных partition, вы можете выполнить ALTER TABLE ... ADD PARTITION или ALTER TABLE ... MODIFY PARTITION после создания таблицы.

Установить начальный носитель хранения и автоматическое время охлаждения хранилища

PROPERTIES (
"storage_medium" = "[SSD|HDD]",
{ "storage_cooldown_ttl" = "<num> { YEAR | MONTH | DAY | HOUR } "
| "storage_cooldown_time" = "yyyy-MM-dd HH:mm:ss" }
)

Свойства

  • storage_medium: начальный носитель хранения, который может быть установлен на SSD или HDD. Убедитесь, что тип носителя хранения, который вы явно указали, соответствует типам дисков BE для вашего кластера Selena, указанным в статическом параметре BE storage_root_path.

    Если параметр конфигурации FE enable_strict_storage_medium_check установлен в true, система строго проверяет тип диска BE при создании таблицы. Если носитель хранения, который вы указали в CREATE TABLE, не соответствует типу диска BE, возвращается ошибка "Failed to find enough host in all backends with storage medium is SSD|HDD." и создание таблицы завершается неудачей. Если enable_strict_storage_medium_check установлен в false, система игнорирует эту ошибку и принудительно создает таблицу. Однако дисковое пространство кластера может быть неравномерно распределено после загрузки данных.

    Начиная с v1.5.2, система автоматически определяет носитель хранения на основе типа диска BE, если storage_medium явно не указан.

    • Система автоматически устанавливает этот параметр в SSD в следующих сценариях:

      • Типы дисков, сообщаемые BE (storage_root_path), содержат только SSD.
      • Типы дисков, сообщаемые BE (storage_root_path), содержат как SSD, так и HDD. Обратите внимание, что начиная с v1.5.2, система устанавливает storage_medium в SSD, когда storage_root_path, сообщаемые BE, содержат как SSD, так и HDD, и свойство storage_cooldown_time указано.
    • Система автоматически устанавливает этот параметр в HDD в следующих сценариях:

      • Типы дисков, сообщаемые BE (storage_root_path), содержат только HDD.
      • Начиная с 2.3.10, 2.4.5, 2.5.4 и 3.0, система устанавливает storage_medium в HDD, когда storage_root_path, сообщаемые BE, содержат как SSD, так и HDD, и свойство storage_cooldown_time не указано.
  • storage_cooldown_ttl или storage_cooldown_time: автоматическое время охлаждения хранилища или временной интервал. Автоматическое охлаждение хранилища относится к автоматической миграции данных с SSD на HDD. Эта функция эффективна только тогда, когда начальный носитель хранения — SSD.

    • storage_cooldown_ttl: временной интервал автоматического охлаждения хранилища для partition в этой таблице. Если вам нужно сохранить самые последние partition на SSD и автоматически охладить более старые partition на HDD после определенного временного интервала, вы можете использовать этот параметр. Автоматическое время охлаждения хранилища для каждого partition рассчитывается с использованием значения этого параметра плюс верхняя временная граница partition.

    Поддерживаемые значения: <num> YEAR, <num> MONTH, <num> DAY и <num> HOUR. <num> — неотрицательное целое число. Значение по умолчанию — null, что означает, что охлаждение хранилища не выполняется автоматически.

    Например, вы указываете значение как "storage_cooldown_ttl"="1 DAY" при создании таблицы, и существует partition p20230801 с диапазоном [2023-08-01 00:00:00,2023-08-02 00:00:00). Автоматическое время охлаждения хранилища для этого partition — 2023-08-03 00:00:00, что составляет 2023-08-02 00:00:00 + 1 DAY. Если вы указываете значение как "storage_cooldown_ttl"="0 DAY" при создании таблицы, автоматическое время охлаждения хранилища для этого partition — 2023-08-02 00:00:00.

    • storage_cooldown_time: автоматическое время охлаждения хранилища (абсолютное время), когда таблица охлаждается с SSD на HDD. Указанное время должно быть позже текущего времени. Формат: "yyyy-MM-dd HH:mm:ss". Когда вам нужно настроить различные свойства для указанных partition, вы можете выполнить ALTER TABLE ... ADD PARTITION или ALTER TABLE ... MODIFY PARTITION.
Использование
  • Сравнение параметров, связанных с автоматическим охлаждением хранилища, выглядит следующим образом:

    • storage_cooldown_ttl: Свойство таблицы, которое указывает временной интервал автоматического охлаждения хранилища для partition в таблице. Система автоматически охлаждает partition в момент значение этого параметра плюс верхняя временная граница partition. Таким образом, автоматическое охлаждение хранилища выполняется на уровне partition, что более гибко.
    • storage_cooldown_time: Свойство таблицы, которое указывает автоматическое время охлаждения хранилища (абсолютное время) для этой таблицы. Кроме того, вы можете настроить различные свойства для указанных partition после создания таблицы.
    • storage_cooldown_second: Статический параметр FE, который указывает задержку автоматического охлаждения хранилища для всех таблиц в кластере.
  • Свойство таблицы storage_cooldown_ttl или storage_cooldown_time имеет приоритет над статическим параметром FE storage_cooldown_second.

  • При настройке этих параметров необходимо указать "storage_medium = "SSD".

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

  • Выполните SHOW PARTITIONS FROM <table_name> для просмотра автоматического времени охлаждения хранилища для каждого partition.

Ограничения
  • Expression и List partitioning не поддерживаются.
  • Столбец partition должен быть типа даты.
  • Несколько столбцов partition не поддерживаются.
  • Таблицы Primary Key не поддерживаются.

Установить количество реплик для каждого tablet в partition

replication_num: количество реплик для каждой таблицы в partition. Число по умолчанию: 3.

PROPERTIES (
"replication_num" = "<num>"
)

Bloom filter индексы

Если тип Engine — olap, вы можете указать столбец для применения bloom filter индексов.

Следующие ограничения применяются при использовании bloom filter индекса:

  • Вы можете создавать bloom filter индексы для всех столбцов таблицы Duplicate Key или Primary Key. Для таблицы Aggregate или Unique Key вы можете создавать bloom filter индексы только для ключевых столбцов.
  • Столбцы TINYINT, FLOAT, DOUBLE и DECIMAL не поддерживают создание bloom filter индексов.
  • Bloom filter индексы могут только улучшить производительность запросов, содержащих операторы in и =, такие как Select xxx from table where x in {} и Select xxx from table where column = xxx. Более дискретные значения в этом столбце приведут к более точным запросам.

Для получения дополнительной информации см. Bloom filter индексирование

PROPERTIES (
"bloom_filter_columns"="k1,k2,k3"
)

Colocate Join

Если вы хотите использовать атрибуты Colocate Join, укажите это в properties.

PROPERTIES (
"colocate_with"="table1"
)

Динамические partition

Если вы хотите использовать атрибуты динамического разбиения на partition, пожалуйста, укажите это в properties.

PROPERTIES (
"dynamic_partition.enable" = "true|false",
"dynamic_partition.time_unit" = "DAY|WEEK|MONTH",
"dynamic_partition.start" = "${integer_value}",
"dynamic_partition.end" = "${integer_value}",
"dynamic_partition.prefix" = "${string_value}",
"dynamic_partition.buckets" = "${integer_value}"

PROPERTIES

ПараметрОбязательноОписание
dynamic_partition.enableНетВключить ли динамическое разбиение на partition. Допустимые значения: TRUE и FALSE. Значение по умолчанию: TRUE.
dynamic_partition.time_unitДаВременная гранулярность для динамически созданных partition. Это обязательный параметр. Допустимые значения: DAY, WEEK и MONTH. Временная гранулярность определяет формат суффикса для динамически созданных partition.
- Если значение DAY, формат суффикса для динамически созданных partition — yyyyMMdd. Пример суффикса имени partition — 20200321.
- Если значение WEEK, формат суффикса для динамически созданных partition — yyyy_ww, например 2020_13 для 13-й недели 2020 года.
- Если значение MONTH, формат суффикса для динамически созданных partition — yyyyMM, например 202003.
dynamic_partition.startНетНачальное смещение динамического разбиения на partition. Значение этого параметра должно быть отрицательным целым числом. Partition до этого смещения будут удалены на основе текущего дня, недели или месяца, который определяется dynamic_partition.time_unit. Значение по умолчанию — Integer.MIN_VALUE, а именно -2147483648, что означает, что исторические partition не будут удалены.
dynamic_partition.endДаКонечное смещение динамического разбиения на partition. Значение этого параметра должно быть положительным целым числом. Partition от текущего дня, недели или месяца до конечного смещения будут созданы заранее.
dynamic_partition.prefixНетПрефикс, добавляемый к именам динамических partition. Значение по умолчанию: p.
dynamic_partition.bucketsНетКоличество bucket'ов на динамический partition. Значение по умолчанию совпадает с количеством bucket'ов, определяемым зарезервированным словом BUCKETS, или автоматически устанавливаемым Selena.
примечание

Когда столбец partition имеет тип INT, его формат должен быть yyyyMMdd, независимо от гранулярности времени partition.

Размер bucket с random bucketing

Начиная с v1.5.2, для таблиц, настроенных с random bucketing, вы можете указать размер bucket с помощью параметра bucket_size в PROPERTIES при создании таблицы, чтобы включить динамическое увеличение количества bucket'ов по требованию. Единица измерения: B.

PROPERTIES (
"bucket_size" = "1073741824"
)

Алгоритм сжатия данных

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

Допустимые значения compression:

  • LZ4: алгоритм LZ4.
  • ZSTD: алгоритм Zstandard.
  • ZLIB: алгоритм zlib.
  • SNAPPY: алгоритм Snappy.

Начиная с v1.5.2, Selena поддерживает указание уровня сжатия для формата сжатия zstd при создании таблицы.

Синтаксис:

PROPERTIES ("compression" = "zstd(<compression_level>)")

compression_level: уровень сжатия для формата сжатия ZSTD. Тип: Integer. Диапазон: [1,22]. По умолчанию: 3 (Рекомендуется). Чем больше число, тем выше коэффициент сжатия. Чем выше уровень сжатия, тем больше времени требуется на сжатие и распаковку.

Пример:

PROPERTIES ("compression" = "zstd(3)")

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

Кворум записи для загрузки данных

Если ваш кластер Selena имеет несколько реплик данных, вы можете установить разный кворум записи для таблиц, то есть сколько реплик должно вернуть успешную загрузку, прежде чем Selena сможет определить, что задача загрузки успешна. Вы можете указать кворум записи, добавив свойство write_quorum при создании таблицы. Это свойство поддерживается начиная с v1.5.2.

Допустимые значения write_quorum:

  • MAJORITY: Значение по умолчанию. Когда большинство реплик данных возвращают успешную загрузку, Selena возвращает успешную задачу загрузки. В противном случае Selena возвращает неудачную задачу загрузки.
  • ONE: Когда одна из реплик данных возвращает успешную загрузку, Selena возвращает успешную задачу загрузки. В противном случае Selena возвращает неудачную задачу загрузки.
  • ALL: Когда все реплики данных возвращают успешную загрузку, Selena возвращает успешную задачу загрузки. В противном случае Selena возвращает неудачную задачу загрузки.
предупреждение
  • Установка низкого кворума записи для загрузки увеличивает риск недоступности данных и даже потери. Например, вы загружаете данные в таблицу с одним кворумом записи в кластере Selena с двумя репликами, и данные были успешно загружены только в одну реплику. Несмотря на то, что Selena определяет задачу загрузки как успешную, существует только одна выжившая реплика данных. Если сервер, который хранит tablet'ы загруженных данных, выходит из строя, данные в этих tablet'ах становятся недоступными. И если диск сервера поврежден, данные теряются.
  • Selena возвращает статус задачи загрузки только после того, как все реплики данных вернули статус. Selena не вернет статус задачи загрузки, когда есть реплики, статус загрузки которых неизвестен. В реплике тайм-аут загрузки также считается неудачной загрузкой.

Режим записи и репликации данных реплики

Если ваш кластер Selena имеет несколько реплик данных, вы можете указать параметр replicated_storage в PROPERTIES для настройки режима записи и репликации данных между репликами.

  • true (по умолчанию в v1.5.2 и более поздних версиях) указывает на "single leader replication", что означает, что данные записываются только в основную реплику. Другие реплики синхронизируют данные из основной реплики. Этот режим значительно снижает затраты на CPU, вызванные записью данных в несколько реплик. Он поддерживается начиная с v1.5.2.
  • false (по умолчанию в v1.5.2) указывает на "leaderless replication", что означает, что данные напрямую записываются в несколько реплик, без различения основных и вторичных реплик. Затраты на CPU умножаются на количество реплик.

В большинстве случаев использование значения по умолчанию обеспечивает лучшую производительность записи данных. Если вы хотите изменить режим записи и репликации данных между репликами, выполните команду ALTER TABLE. Пример:

ALTER TABLE example_db.my_table
SET ("replicated_storage" = "false");

Ограничения unique и foreign key для Delta Join

Чтобы включить перезапись запросов в сценарии View Delta Join, вы должны определить ограничения Unique Key unique_constraints и ограничения Foreign Key foreign_key_constraints для таблицы, которая будет объединена в Delta Join. См. Асинхронное материализованное представление - Перезапись запросов в сценарии View Delta Join для получения дополнительной информации.

PROPERTIES (
"unique_constraints" = "<unique_key>[, ...]",
"foreign_key_constraints" = "
(<child_column>[, ...])
REFERENCES
[catalog_name].[database_name].<parent_table_name>(<parent_column>[, ...])
[;...]
"
)
  • child_column: Foreign Key таблицы. Вы можете определить несколько child_column.
  • catalog_name: имя каталога, в котором находится таблица для объединения. По умолчанию используется каталог по умолчанию, если этот параметр не указан.
  • database_name: имя базы данных, в которой находится таблица для объединения. Используется текущая база данных, если этот параметр не указан.
  • parent_table_name: имя таблицы для объединения.
  • parent_column: столбец для объединения. Они должны быть Primary Keys или Unique Keys соответствующих таблиц.
предупреждение
  • unique_constraints и foreign_key_constraints используются только для перезаписи запросов. Проверки ограничений Foreign Key не гарантируются при загрузке данных в таблицу. Вы должны убедиться, что данные, загружаемые в таблицу, соответствуют ограничениям.
  • Первичные ключи таблицы Primary Key или уникальные ключи таблицы Unique Key по умолчанию являются соответствующими unique_constraints. Вам не нужно устанавливать это вручную.
  • child_column в foreign_key_constraints таблицы должен ссылаться на unique_key в unique_constraints другой таблицы.
  • Количество child_column и parent_column должно совпадать.
  • Типы данных child_column и соответствующего parent_column должны совпадать.

Cloud-native таблицы для кластеров shared-data

Чтобы использовать ваш кластер Selena Shared-data, вы должны создать cloud-native таблицы со следующими свойствами:

PROPERTIES (
"storage_volume" = "<storage_volume_name>",
"datacache.enable" = "{ true | false }",
"datacache.partition_duration" = "<string_value>",
"file_bundling" = "{ true | false }"
)
  • storage_volume: Имя тома хранилища, используемого для хранения cloud-native таблицы, которую вы хотите создать. Если это свойство не указано, используется том хранилища по умолчанию. Это свойство поддерживается начиная с v1.5.2.

  • datacache.enable: Включить ли кеш локального диска. По умолчанию: true.

    • Когда это свойство установлено в true, данные, которые должны быть загружены, одновременно записываются в объектное хранилище и локальный диск (в качестве кеша для ускорения запросов).
    • Когда это свойство установлено в false, данные загружаются только в объектное хранилище.
    примечание

    Чтобы включить кеш локального диска, вы должны указать каталог диска в параметре конфигурации BE storage_root_path.

  • datacache.partition_duration: Срок действия горячих данных. Когда кеш локального диска включен, все данные загружаются в кеш. Когда кеш заполнен, Selena удаляет менее недавно использованные данные из кеша. Когда запросу необходимо просканировать удаленные данные, Selena проверяет, находятся ли данные в пределах срока действия. Если данные находятся в пределах срока действия, Selena снова загружает данные в кеш. Если данные не находятся в пределах срока действия, Selena не загружает их в кеш. Это свойство представляет собой строковое значение, которое может быть указано со следующими единицами: YEAR, MONTH, DAY и HOUR, например, 7 DAY и 12 HOUR. Если оно не указано, все данные кешируются как горячие данные.

    примечание

    Это свойство доступно только тогда, когда datacache.enable установлено в true.

  • file_bundling (Опционально): Включить ли оптимизацию File Bundling для cloud-native таблицы. Поддерживается начиная с v2.0.0. Когда эта функция включена (установка в true), система автоматически объединяет файлы данных, генерируемые операциями загрузки, Compaction или Publish, тем самым снижая затраты на API, вызванные частым доступом к системе внешнего хранилища.

    примечание
    • File Bundling доступен только для кластеров shared-data с Selena v2.0.0 или более поздней версией.
    • File Bundling включен по умолчанию для таблиц, созданных в v2.0.0 или более поздней версии, управляется конфигурацией FE enable_file_bundling (По умолчанию: true).
    • После включения File Bundling вы можете понизить версию кластера только до v1.5.2 или более поздней версии. Если вы хотите понизить версию до версий до v1.5.2, вы должны сначала удалить таблицы, для которых включена File Bundling.
    • File Bundling остается отключенным по умолчанию для существующих таблиц после обновления кластера до v2.0.0.
    • Вы можете вручную включить File Bundling для существующих таблиц, используя оператор ALTER TABLE со следующими ограничениями:
      • Вы не можете включить File Bundling для таблиц с Rollup Indexes, созданными в версиях до v2.0.0. Вы можете удалить и пересоздать индексы в v2.0.0 или более поздней версии, а затем включить File Bundling для таблиц.

      • Вы не можете изменять свойство file_bundling повторно в течение определенного периода времени. В противном случае система вернет ошибку. Вы можете проверить, доступно ли свойство file_bundling для изменения, выполнив следующий SQL-запрос:

        SELECT METADATA_SWITCH_VERSION FROM information_schema.partitions_meta WHERE TABLE_NAME = '<table_name>';

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

        Вы можете сократить этот интервал, установив более низкое значение для динамической конфигурации FE lake_autovacuum_grace_period_minutes. Однако не забудьте сбросить конфигурацию на исходное значение после изменения свойства file_bundling.

Быстрая эволюция схемы

fast_schema_evolution: Включить ли быструю эволюцию схемы для таблицы. Допустимые значения: TRUE или FALSE (по умолчанию). Включение быстрой эволюции схемы может увеличить скорость изменения схемы и уменьшить использование ресурсов при добавлении или удалении столбцов. В настоящее время это свойство может быть включено только при создании таблицы и не может быть изменено с помощью ALTER TABLE после создания таблицы.

примечание
  • Быстрая эволюция схемы поддерживается для кластеров shared-nothing начиная с v1.5.2.
  • Быстрая эволюция схемы поддерживается для кластеров shared-data начиная с v1.5.2 и включена по умолчанию. Вам не нужно указывать это свойство при создании cloud-native таблиц в кластерах shared-data. Динамический параметр FE enable_fast_schema_evolution (По умолчанию: true) управляет этим поведением.

Запрет Base Compaction

base_compaction_forbidden_time_ranges: Временной диапазон, в течение которого Base Compaction запрещена для таблицы. Когда это свойство установлено, система выполняет Base Compaction на подходящих tablet'ах только за пределами указанного временного диапазона. Это свойство поддерживается начиная с v1.5.2.

примечание

Убедитесь, что количество загрузок данных в таблицу не превышает 500 в течение периода, когда Base Compaction запрещена.

Значение base_compaction_forbidden_time_ranges следует синтаксису Quartz cron и поддерживает только эти поля: <minute> <hour> <day-of-the-month> <month> <day-of-the-week>, где <minute> должна быть *.

crontab_param_value ::= [ "" | crontab ]

crontab ::= * <hour> <day-of-the-month> <month> <day-of-the-week>
  • Когда это свойство не установлено или установлено в "" (пустая строка), Base Compaction не запрещена ни в какое время.
  • Когда это свойство установлено в * * * * *, Base Compaction всегда запрещена.
  • Другие значения следуют синтаксису Quartz cron.
    • Независимое значение указывает единицу времени поля. Например, 8 в поле <hour> означает 8:00-8:59.
    • Диапазон значений указывает временной диапазон поля. Например, 8-9 в поле <hour> означает 8:00-9:59.
    • Несколько диапазонов значений, разделенных запятыми, указывают несколько временных диапазонов поля.
    • <day of the week> имеет начальное значение 1 для воскресенья, а 7 означает субботу.

Пример:

-- Запретить Base Compaction с 8:00 до 9:00 вечера каждый день.
'base_compaction_forbidden_time_ranges' = '* 8-20 * * *'

-- Запретить Base Compaction с 0:00 до 5:00 утра и с 9:00 вечера до 11:00 вечера каждый день.
'base_compaction_forbidden_time_ranges' = '* 0-4,21-22 * * *'

-- Запретить Base Compaction с понедельника по пятницу (то есть разрешить его в субботу и воскресенье).
'base_compaction_forbidden_time_ranges' = '* * * * 2-6'

-- Запретить Base Compaction с 8:00 до 9:00 вечера каждый рабочий день (то есть с понедельника по пятницу).
'base_compaction_forbidden_time_ranges' = '* 8-20 * * 2-6'

Указать Common Partition Expression TTL

Начиная с v1.5.2, собственные таблицы Selena поддерживают Common Partition Expression TTL.

partition_retention_condition: Выражение, которое объявляет partition, которые должны быть сохранены динамически. Partition, которые не соответствуют условию в выражении, будут регулярно удаляться.

  • Выражение может содержать только столбцы partition и константы. Столбцы, не являющиеся столбцами partition, не поддерживаются.
  • Common Partition Expression применяется к List partition и Range partition по-разному:
    • Для таблиц с List partition Selena поддерживает удаление partition, отфильтрованных Common Partition Expression.
    • Для таблиц с Range partition Selena может только фильтровать и удалять partition, используя возможность обрезки partition FE. Partition, соответствующие предикатам, которые не поддерживаются обрезкой partition, не могут быть отфильтрованы и удалены.

Пример:

-- Сохранить данные за последние три месяца. Столбец `dt` является столбцом partition таблицы.
"partition_retention_condition" = "dt >= CURRENT_DATE() - INTERVAL 3 MONTH"

Чтобы отключить эту функцию, вы можете использовать оператор ALTER TABLE, чтобы установить это свойство в пустую строку:

ALTER TABLE tbl SET('partition_retention_condition' = '');

Установить свойства Flat JSON на уровне таблицы

В v1.5.2 Selena представила функцию Flat JSON для улучшения эффективности запросов данных JSON и уменьшения сложности использования JSON. Эта функция контролировалась определенными элементами конфигурации BE и системными переменными. В результате она могла быть включена (или отключена) только глобально.

Начиная с v2.0.0, вы можете устанавливать свойства, связанные с Flat JSON, на уровне таблицы.

PROPERTIES (
"flat_json.enable" = "{ true | false }",
"flat_json.null.factor" = "",
"flat_json.sparsity.factor" = "",
"flat_json.column.max" = ""
)
  • flat_json.enable (Опционально): Включить ли функцию Flat JSON. После включения этой функции вновь загруженные данные JSON будут автоматически сглажены, что улучшит производительность запросов JSON.
  • flat_json.null.factor (Опционально): Пороговая доля значений NULL в столбце. Столбец не будет извлечен Flat JSON, если его доля значений NULL выше этого порога. Этот параметр действует только тогда, когда flat_json.enable установлен в true. Значение по умолчанию: 0.3.
  • flat_json.sparsity.factor (Опционально): Пороговая доля столбцов с одинаковым именем. Столбец не будет извлечен Flat JSON, если доля столбцов с одинаковым именем ниже этого значения. Этот параметр действует только тогда, когда flat_json.enable установлен в true. Значение по умолчанию: 0.3.
  • flat_json.column.max (Опционально): Максимальное количество подполей, которые могут быть извлечены Flat JSON. Этот параметр действует только тогда, когда flat_json.enable установлен в true. Значение по умолчанию: 100.

Примеры

Aggregate таблица с Hash bucketing и columnar хранилищем

CREATE TABLE example_db.table_hash
(
k1 TINYINT,
k2 DECIMAL(10, 2) DEFAULT "10.5",
v1 CHAR(10) REPLACE,
v2 INT SUM
)
ENGINE=olap
AGGREGATE KEY(k1, k2)
COMMENT "my first selena table"
DISTRIBUTED BY HASH(k1)
PROPERTIES ("storage_type"="column");

Aggregate таблица с установленным носителем хранения и временем охлаждения

CREATE TABLE example_db.table_hash
(
k1 BIGINT,
k2 LARGEINT,
v1 VARCHAR(2048) REPLACE,
v2 SMALLINT SUM DEFAULT "10"
)
ENGINE=olap
UNIQUE KEY(k1, k2)
DISTRIBUTED BY HASH (k1, k2)
PROPERTIES(
"storage_type"="column",
"storage_medium" = "SSD",
"storage_cooldown_time" = "2015-06-04 00:00:00"
);

Duplicate Key таблица с Range partition, Hash bucketing, column-based хранилищем, носителем хранения и временем охлаждения

LESS THAN

CREATE TABLE example_db.table_range
(
k1 DATE,
k2 INT,
k3 SMALLINT,
v1 VARCHAR(2048),
v2 DATETIME DEFAULT "2014-02-04 15:36:00"
)
ENGINE=olap
DUPLICATE KEY(k1, k2, k3)
PARTITION BY RANGE (k1)
(
PARTITION p1 VALUES LESS THAN ("2014-01-01"),
PARTITION p2 VALUES LESS THAN ("2014-06-01"),
PARTITION p3 VALUES LESS THAN ("2014-12-01")
)
DISTRIBUTED BY HASH(k2)
PROPERTIES(
"storage_medium" = "SSD",
"storage_cooldown_time" = "2015-06-04 00:00:00"
);

Примечание:

Это выражение создаст три partition данных:

( {    MIN     },   {"2014-01-01"} )
[ {"2014-01-01"}, {"2014-06-01"} )
[ {"2014-06-01"}, {"2014-12-01"} )

Данные за пределами этих диапазонов не будут загружены.

Fixed Range

CREATE TABLE table_range
(
k1 DATE,
k2 INT,
k3 SMALLINT,
v1 VARCHAR(2048),
v2 DATETIME DEFAULT "2014-02-04 15:36:00"
)
ENGINE=olap
DUPLICATE KEY(k1, k2, k3)
PARTITION BY RANGE (k1, k2, k3)
(
PARTITION p1 VALUES [("2014-01-01", "10", "200"), ("2014-01-01", "20", "300")),
PARTITION p2 VALUES [("2014-06-01", "100", "200"), ("2014-07-01", "100", "300"))
)
DISTRIBUTED BY HASH(k2)
PROPERTIES(
"storage_medium" = "SSD"
);

Внешняя таблица MySQL

CREATE EXTERNAL TABLE example_db.table_mysql
(
k1 DATE,
k2 INT,
k3 SMALLINT,
k4 VARCHAR(2048),
k5 DATETIME
)
ENGINE=mysql
PROPERTIES
(
"host" = "127.0.0.1",
"port" = "8239",
"user" = "mysql_user",
"password" = "mysql_passwd",
"database" = "mysql_db_test",
"table" = "mysql_table_test"
)

Таблица со столбцами HLL

CREATE TABLE example_db.example_table
(
k1 TINYINT,
k2 DECIMAL(10, 2) DEFAULT "10.5",
v1 HLL HLL_UNION,
v2 HLL HLL_UNION
)
ENGINE=olap
AGGREGATE KEY(k1, k2)
DISTRIBUTED BY HASH(k1)
PROPERTIES ("storage_type"="column");

Таблица, использующая тип агрегации BITMAP_UNION

Исходный тип данных столбцов v1 и v2 должен быть TINYINT, SMALLINT или INT.

CREATE TABLE example_db.example_table
(
k1 TINYINT,
k2 DECIMAL(10, 2) DEFAULT "10.5",
v1 BITMAP BITMAP_UNION,
v2 BITMAP BITMAP_UNION
)
ENGINE=olap
AGGREGATE KEY(k1, k2)
DISTRIBUTED BY HASH(k1)
PROPERTIES ("storage_type"="column");

Таблицы, поддерживающие Colocate Join

CREATE TABLE `t1`
(
`id` int(11) COMMENT "",
`value` varchar(8) COMMENT ""
)
ENGINE=OLAP
DUPLICATE KEY(`id`)
DISTRIBUTED BY HASH(`id`)
PROPERTIES
(
"colocate_with" = "t1"
);

CREATE TABLE `t2`
(
`id` int(11) COMMENT "",
`value` varchar(8) COMMENT ""
)
ENGINE=OLAP
DUPLICATE KEY(`id`)
DISTRIBUTED BY HASH(`id`)
PROPERTIES
(
"colocate_with" = "t1"
);

Таблица с bitmap индексом

CREATE TABLE example_db.table_hash
(
k1 TINYINT,
k2 DECIMAL(10, 2) DEFAULT "10.5",
v1 CHAR(10) REPLACE,
v2 INT SUM,
INDEX k1_idx (k1) USING BITMAP COMMENT 'xxxxxx'
)
ENGINE=olap
AGGREGATE KEY(k1, k2)
COMMENT "my first selena table"
DISTRIBUTED BY HASH(k1)
PROPERTIES ("storage_type"="column");

Таблица с динамическими partition

Функция динамического разбиения на partition должна быть включена ("dynamic_partition.enable" = "true") в конфигурации FE. Для получения дополнительной информации см. Настройка динамических partition.

Этот пример создает partition на следующие три дня и удаляет partition, созданные три дня назад. Например, если сегодня 2020-01-08, будут созданы partition со следующими именами: p20200108, p20200109, p20200110, p20200111, а их диапазоны:

[types: [DATE]; keys: [2020-01-08]; ‥types: [DATE]; keys: [2020-01-09]; )
[types: [DATE]; keys: [2020-01-09]; ‥types: [DATE]; keys: [2020-01-10]; )
[types: [DATE]; keys: [2020-01-10]; ‥types: [DATE]; keys: [2020-01-11]; )
[types: [DATE]; keys: [2020-01-11]; ‥types: [DATE]; keys: [2020-01-12]; )
CREATE TABLE example_db.dynamic_partition
(
k1 DATE,
k2 INT,
k3 SMALLINT,
v1 VARCHAR(2048),
v2 DATETIME DEFAULT "2014-02-04 15:36:00"
)
ENGINE=olap
DUPLICATE KEY(k1, k2, k3)
PARTITION BY RANGE (k1)
(
PARTITION p1 VALUES LESS THAN ("2014-01-01"),
PARTITION p2 VALUES LESS THAN ("2014-06-01"),
PARTITION p3 VALUES LESS THAN ("2014-12-01")
)
DISTRIBUTED BY HASH(k2)
PROPERTIES(
"storage_medium" = "SSD",
"dynamic_partition.enable" = "true",
"dynamic_partition.time_unit" = "DAY",
"dynamic_partition.start" = "-3",
"dynamic_partition.end" = "3",
"dynamic_partition.prefix" = "p",
"dynamic_partition.buckets" = "10"
);

Таблица с несколькими partition, созданными пакетно, и целочисленным столбцом в качестве столбца разбиения на partition

В следующем примере столбец разбиения на partition datekey имеет тип INT. Все partition создаются одним простым предложением partition START ("1") END ("5") EVERY (1). Диапазон всех partition начинается с 1 и заканчивается на 5 с гранулярностью partition 1:

ПРИМЕЧАНИЕ

Значения столбца разбиения на partition в START() и END() должны быть заключены в кавычки, в то время как гранулярность partition в EVERY() не нужно заключать в кавычки.

CREATE TABLE site_access (
datekey INT,
site_id INT,
city_code SMALLINT,
user_name VARCHAR(32),
pv BIGINT DEFAULT '0'
)
ENGINE=olap
DUPLICATE KEY(datekey, site_id, city_code, user_name)
PARTITION BY RANGE (datekey) (START ("1") END ("5") EVERY (1)
)
DISTRIBUTED BY HASH(site_id)
PROPERTIES ("replication_num" = "3");

Внешняя таблица Hive

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

CREATE EXTERNAL TABLE example_db.table_hive
(
k1 TINYINT,
k2 VARCHAR(50),
v INT
)
ENGINE=hive
PROPERTIES
(
"resource" = "hive0",
"database" = "hive_db_name",
"table" = "hive_table_name"
);

Таблица Primary Key с конкретным ключом сортировки

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

create table users (
user_id bigint NOT NULL,
name string NOT NULL,
email string NULL,
address string NULL,
age tinyint NULL,
sex tinyint NULL,
last_active datetime,
property0 tinyint NOT NULL,
property1 tinyint NOT NULL,
property2 tinyint NOT NULL,
property3 tinyint NOT NULL
)
PRIMARY KEY (`user_id`)
DISTRIBUTED BY HASH(`user_id`)
ORDER BY(`address`,`last_active`)
PROPERTIES(
"replication_num" = "3",
"enable_persistent_index" = "true"
);

Разделенная временная таблица

CREATE TEMPORARY TABLE example_db.temp_table
(
k1 DATE,
k2 INT,
k3 SMALLINT,
v1 VARCHAR(2048),
v2 DATETIME DEFAULT "2014-02-04 15:36:00"
)
ENGINE=olap
DUPLICATE KEY(k1, k2, k3)
PARTITION BY RANGE (k1)
(
PARTITION p1 VALUES LESS THAN ("2014-01-01"),
PARTITION p2 VALUES LESS THAN ("2014-06-01"),
PARTITION p3 VALUES LESS THAN ("2014-12-01")
)
DISTRIBUTED BY HASH(k2);

Таблица со свойствами Flat JSON

CREATE TABLE example_db.example_table
(
k1 DATE,
k2 INT,
v1 VARCHAR(2048),
v2 JSON
)
ENGINE=olap
DUPLICATE KEY(k1, k2)
DISTRIBUTED BY HASH(k2)
PROPERTIES (
"flat_json.enable" = "true",
"flat_json.null.factor" = "0.5",
"flat_json.sparsity.factor" = "0.5",
"flat_json.column.max" = "50"
);

Ссылки