Перейти к основному содержимому

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", ...)]
подсказка
  • Имя таблицы, имя раздела, имя столбца и имя индекса, которые вы создаете, должны соответствовать соглашениям об именовании в Системные ограничения.
  • При указании имени базы данных, имени таблицы, имени столбца или имени раздела обратите внимание, что некоторые литералы используются как зарезервированные ключевые слова в Selena. Не используйте эти ключевые слова напрямую в SQL-операторах. Если вы хотите использовать такое ключевое слово в SQL-операторе, заключите его в пару обратных кавычек (`). См. Ключевые слова для этих зарезервированных ключевых слов.

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

EXTERNAL

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

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

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

подсказка

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

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

Начиная с версии 1.5.0, Selena поддерживает создание таблиц в формате Parquet в каталогах Hive и поддерживает загрузку данных в эти таблицы Hive в формате Parquet с помощью INSERT INTO. Начиная с версии 1.5.0, 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

Создает временную таблицу. Начиная с версии 1.5.0, 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. Начиная с версии 1.5.0, 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. Начиная с версии 1.5.0, Selena поддерживает столбцы AUTO_INCREMENT.

AS generation_expr: указывает сгенерированный столбец и его выражение. Сгенерированный столбец может использоваться для предварительного вычисления и хранения результатов выражений, что значительно ускоряет запросы с теми же сложными выражениями. Начиная с версии 1.5.0, 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. В противном случае таблица не может быть создана.

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

Раздел

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

Создание разделов динамически

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

Создание разделов по одному

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

Синтаксис:

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>", ... ] )
, ... ]
)
примечание

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

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

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

  • Разделы закрыты слева и открыты справа. Левая граница первого раздела имеет минимальное значение.

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

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

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

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

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

Синтаксис:

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. Вы можете настроить левые и правые разделы.
  • Fixed Range такой же, как LESS THAN, в других аспектах.
  • Когда только один столбец указан как столбец разделения, вы можете установить MAXVALUE как верхнюю границу для столбца разделения самого последнего раздела.
PARTITION BY RANGE (pay_dt) (
PARTITION p202101 VALUES [("20210101"), ("20210201")),
PARTITION p202102 VALUES [("20210201"), ("20210301")),
PARTITION p202103 VALUES [("20210301"), (MAXVALUE))
)

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

Синтаксис

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

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

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

Описание

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

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

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

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

Selena поддерживает хеш-бакетирование и случайное бакетирование. Если вы не настраиваете бакетирование, Selena использует случайное бакетирование и автоматически устанавливает количество бакетов по умолчанию.

  • Случайное бакетирование (начиная с версии 1.5.0)

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

    DISTRIBUTED BY RANDOM BUCKETS <num>

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

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

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

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

  • Хеш-бакетирование

    Синтаксис:

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

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

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

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

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

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

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

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

Rollup index

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

Синтаксис:

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

ORDER BY

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

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

PROPERTIES

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

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

Область действия свойств: Если таблица имеет только один раздел, свойства принадлежат таблице. Если таблица разделена на несколько разделов, свойства принадлежат каждому разделу. И когда вам нужно настроить разные свойства для указанных разделов, вы можете выполнить 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, система игнорирует эту ошибку и принудительно создает таблицу. Однако дисковое пространство кластера может быть неравномерно распределено после загрузки данных.

    Начиная с версий 2.3.6, 2.4.2, 2.5.1 и 3.0, система автоматически определяет носитель хранения на основе типа диска BE, если storage_medium не указан явно.

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

      • Типы дисков, сообщаемые BE (storage_root_path), содержат только SSD.
      • Типы дисков, сообщаемые BE (storage_root_path), содержат как SSD, так и HDD. Обратите внимание, что начиная с версий 2.3.10, 2.4.5, 2.5.4 и 3.0, система устанавливает 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: временной интервал автоматического охлаждения хранения для разделов в этой таблице. Если вам нужно сохранить самые последние разделы на SSD и автоматически охладить старые разделы на HDD через определенный временной интервал, вы можете использовать этот параметр. Время автоматического охлаждения хранения для каждого раздела рассчитывается с использованием значения этого параметра плюс верхняя временная граница раздела.

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

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

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

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

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

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

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

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

Установить количество реплик для каждого планшета в разделах

replication_num: количество реплик для каждой таблицы в разделах. Число по умолчанию: 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"
)

Динамические разделы

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

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

Размер бакета с случайным бакетированием

Начиная с версии 1.5.0, для таблиц, настроенных со случайным бакетированием, вы можете указать размер бакета, используя параметр bucket_size в PROPERTIES при создании таблицы, чтобы включить увеличение количества бакетов по требованию и динамически. Единица: B.

PROPERTIES (
"bucket_size" = "1073741824"
)

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

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

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

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

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

Синтаксис:

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

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

Пример:

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

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

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

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

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

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

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

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

  • true (по умолчанию в версии 3.0 и позже) указывает "репликацию одного лидера", что означает, что данные записываются только в основную реплику. Другие реплики синхронизируют данные из основной реплики. Этот режим значительно снижает стоимость CPU, вызванную записью данных в несколько реплик. Поддерживается начиная с версии 1.5.0.
  • false (по умолчанию в версии 2.5) указывает "репликацию без лидера", что означает, что данные напрямую записываются в несколько реплик, без различения основных и вторичных реплик. Стоимость CPU умножается на количество реплик.

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

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

Ограничения уникального и внешнего ключа 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 должны совпадать.

Облачные таблицы для кластеров с общими данными

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

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

  • 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.

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

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

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

Запретить Base Compaction

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

примечание

Убедитесь, что количество загрузок данных в таблицу не превышает 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'

Примеры

Aggregate таблица с Hash бакетированием и колоночным хранением

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 разделением, Hash бакетированием, колоночным хранением, носителем хранения и временем охлаждения

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"
);

Примечание:

Этот оператор создаст три раздела данных:

( {    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");

Таблица динамических разделов

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

Этот пример создает разделы на следующие три дня и удаляет разделы, созданные три дня назад. Например, если сегодня 2020-01-08, будут созданы разделы со следующими именами: 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"
);

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

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

ПРИМЕЧАНИЕ

Значения столбца разделения в START() и END() должны быть заключены в кавычки, в то время как гранулярность раздела в 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);

Ссылки