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

External table

примечание
  • Начиная с версии 1.5.0, мы рекомендуем использовать каталоги для запроса данных из Hive, Iceberg и Hudi. См. Hive catalog, Iceberg catalog и Hudi catalog.

  • Начиная с версии 1.5.0, мы рекомендуем использовать JDBC catalog для запроса данных из MySQL и PostgreSQL и использовать Elasticsearch catalog для запроса данных из Elasticsearch.

  • Функция External Table была разработана для помощи в загрузке данных в Selena, а НЕ для выполнения эффективных запросов к внешним системам в качестве обычной операции. Более производительным решением была бы загрузка данных в Selena.

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

Начиная с версии 1.5.0, Selena предоставляет функцию Data Cache, которая ускоряет запросы горячих данных к внешним источникам данных. Для получения дополнительной информации см. Data Cache.

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

Начиная с Selena 1.19, Selena позволяет использовать внешнюю таблицу Selena для записи данных из одного кластера Selena в другой. Это обеспечивает разделение чтения и записи и обеспечивает лучшую изоляцию ресурсов. Сначала вы можете создать целевую таблицу в целевом кластере Selena. Затем в исходном кластере Selena вы можете создать внешнюю таблицу Selena, которая имеет ту же схему, что и целевая таблица, и указать информацию о целевом кластере и таблице в поле PROPERTIES.

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

  • Синхронизация данных между кластерами Selena.
  • Разделение чтения и записи. Данные записываются в исходный кластер, а изменения данных из исходного кластера синхронизируются с целевым кластером, который предоставляет службы запросов.

Следующий код показывает, как создать целевую таблицу и внешнюю таблицу.

# Создание целевой таблицы в целевом кластере Selena.
CREATE TABLE t
(
k1 DATE,
k2 INT,
k3 SMALLINT,
k4 VARCHAR(2048),
k5 DATETIME
)
ENGINE=olap
DISTRIBUTED BY HASH(k1);

# Создание внешней таблицы в исходном кластере Selena.
CREATE EXTERNAL TABLE external_t
(
k1 DATE,
k2 INT,
k3 SMALLINT,
k4 VARCHAR(2048),
k5 DATETIME
)
ENGINE=olap
DISTRIBUTED BY HASH(k1)
PROPERTIES
(
"host" = "127.0.0.1",
"port" = "9020",
"user" = "user",
"password" = "passwd",
"database" = "db_test",
"table" = "t"
);

# Запись данных из исходного кластера в целевой кластер путем записи данных во внешнюю таблицу Selena. Второй оператор рекомендуется для производственной среды.
insert into external_t values ('2020-10-11', 1, 1, 'hello', '2020-10-11 10:00:00');
insert into external_t select * from other_table;

Параметры:

  • EXTERNAL: Это ключевое слово указывает, что создаваемая таблица является внешней таблицей.

  • host: Этот параметр указывает IP-адрес узла Leader FE целевого кластера Selena.

  • port: Этот параметр указывает RPC-порт узла FE целевого кластера Selena.

    примечание

    Чтобы обеспечить доступ исходного кластера, которому принадлежат внешние таблицы Selena, к целевому кластеру Selena, вы должны настроить свою сеть и брандмауэр для разрешения доступа к следующим портам:

    • RPC-порт узла FE. См. rpc_port в файле конфигурации FE fe/fe.conf. RPC-порт по умолчанию — 9020.
    • bRPC-порт узла BE. См. brpc_port в файле конфигурации BE be/be.conf. bRPC-порт по умолчанию — 8060.
  • user: Этот параметр указывает имя пользователя, используемое для доступа к целевому кластеру Selena.

  • password: Этот параметр указывает пароль, используемый для доступа к целевому кластеру Selena.

  • database: Этот параметр указывает базу данных, к которой принадлежит целевая таблица.

  • table: Этот параметр указывает имя целевой таблицы.

Следующие ограничения применяются при использовании внешней таблицы Selena:

  • Вы можете выполнять только команды INSERT INTO и SHOW CREATE TABLE для внешней таблицы Selena. Другие методы записи данных не поддерживаются. Кроме того, вы не можете запрашивать данные из внешней таблицы Selena или выполнять DDL-операции с внешней таблицей.
  • Синтаксис создания внешней таблицы такой же, как и создание обычной таблицы, но имена столбцов и другая информация во внешней таблице должны быть такими же, как в целевой таблице.
  • Внешняя таблица синхронизирует метаданные таблицы из целевой таблицы каждые 10 секунд. Если DDL-операция выполняется с целевой таблицей, может быть задержка синхронизации данных между двумя таблицами.

(Устарело) Внешняя таблица для JDBC-совместимой базы данных

Начиная с версии 1.5.0, Selena предоставляет внешние таблицы для запроса JDBC-совместимых баз данных. Таким образом, вы можете анализировать данные таких баз данных с невероятной скоростью без необходимости импорта данных в Selena. В этом разделе описывается, как создать внешнюю таблицу в Selena и запрашивать данные в JDBC-совместимых базах данных.

Предварительные требования

Перед использованием внешней таблицы JDBC для запроса данных убедитесь, что FE и BE имеют доступ к URL загрузки драйвера JDBC. URL загрузки указывается параметром driver_url в операторе, используемом для создания ресурса JDBC.

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

Создание ресурса JDBC

Перед созданием внешней таблицы для запроса данных из базы данных необходимо создать ресурс JDBC в Selena для управления информацией о подключении к базе данных. База данных должна поддерживать драйвер JDBC и называется "целевой базой данных". После создания ресурса вы можете использовать его для создания внешних таблиц.

Выполните следующий оператор для создания ресурса JDBC с именем jdbc0:

CREATE EXTERNAL RESOURCE jdbc0
PROPERTIES (
"type"="jdbc",
"user"="postgres",
"password"="changeme",
"jdbc_uri"="jdbc:postgresql://127.0.0.1:5432/jdbc_test",
"driver_url"="https://repo1.maven.org/maven2/org/postgresql/postgresql/42.3.3/postgresql-42.3.3.jar",
"driver_class"="org.postgresql.Driver"
);

Обязательные параметры в PROPERTIES:

  • type: тип ресурса. Установите значение jdbc.

  • user: имя пользователя, используемое для подключения к целевой базе данных.

  • password: пароль, используемый для подключения к целевой базе данных.

  • jdbc_uri: URI, который драйвер JDBC использует для подключения к целевой базе данных. Формат URI должен соответствовать синтаксису URI базы данных. Для синтаксиса URI некоторых распространенных баз данных посетите официальные веб-сайты Oracle, PostgreSQL, SQL Server.

Примечание: URI должен включать имя целевой базы данных. Например, в приведенном выше примере кода jdbc_test — это имя целевой базы данных, к которой вы хотите подключиться.

  • driver_url: URL загрузки JAR-пакета драйвера JDBC. Поддерживается HTTP URL или file URL, например, https://repo1.maven.org/maven2/org/postgresql/postgresql/42.3.3/postgresql-42.3.3.jar или file:///home/disk1/postgresql-42.3.3.jar.

  • driver_class: имя класса драйвера JDBC. Имена классов драйверов JDBC распространенных баз данных:

    • MySQL: com.mysql.jdbc.Driver (MySQL 5.x и ранее), com.mysql.cj.jdbc.Driver (MySQL 6.x и позже)
    • SQL Server: com.microsoft.sqlserver.jdbc.SQLServerDriver
    • Oracle: oracle.jdbc.driver.OracleDriver
    • PostgreSQL: org.postgresql.Driver

При создании ресурса FE загружает JAR-пакет драйвера JDBC, используя URL, указанный в параметре driver_url, генерирует контрольную сумму и использует контрольную сумму для проверки драйвера JDBC, загруженного BE.

Примечание: Если загрузка JAR-пакета драйвера JDBC не удается, создание ресурса также не удается.

Когда BE впервые запрашивают внешнюю таблицу JDBC и обнаруживают, что соответствующий JAR-пакет драйвера JDBC не существует на их машинах, BE загружают JAR-пакет драйвера JDBC, используя URL, указанный в параметре driver_url, и все JAR-пакеты драйверов JDBC сохраняются в каталоге ${STARROCKS_HOME}/lib/jdbc_drivers.

Просмотр ресурсов JDBC

Выполните следующий оператор для просмотра всех ресурсов JDBC в Selena:

SHOW RESOURCES;

Примечание: Столбец ResourceType имеет значение jdbc.

Удаление ресурса JDBC

Выполните следующий оператор для удаления ресурса JDBC с именем jdbc0:

DROP RESOURCE "jdbc0";

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

Создание базы данных

Выполните следующий оператор для создания и доступа к базе данных с именем jdbc_test в Selena:

CREATE DATABASE jdbc_test; 
USE jdbc_test;

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

Создание внешней таблицы JDBC

Выполните следующий оператор для создания внешней таблицы JDBC с именем jdbc_tbl в базе данных jdbc_test:

create external table jdbc_tbl (
`id` bigint NULL,
`data` varchar(200) NULL
) ENGINE=jdbc
properties (
"resource" = "jdbc0",
"table" = "dest_tbl"
);

Обязательные параметры в properties:

  • resource: имя ресурса JDBC, используемого для создания внешней таблицы.

  • table: имя целевой таблицы в базе данных.

Для поддерживаемых типов данных и сопоставления типов данных между Selena и целевыми базами данных см. [Сопоставление типов данных](External_table.md#Data type mapping).

Примечание:

  • Индексы не поддерживаются.
  • Вы не можете использовать PARTITION BY или DISTRIBUTED BY для указания правил распределения данных.

Запрос внешней таблицы JDBC

Перед запросом внешних таблиц JDBC необходимо выполнить следующий оператор для включения движка Pipeline:

set enable_pipeline_engine=true;

Примечание: Если движок Pipeline уже включен, вы можете пропустить этот шаг.

Выполните следующий оператор для запроса данных в целевой базе данных с помощью внешних таблиц JDBC.

select * from JDBC_tbl;

Selena поддерживает проталкивание предикатов путем проталкивания условий фильтрации в целевую таблицу. Выполнение условий фильтрации как можно ближе к источнику данных может улучшить производительность запросов. В настоящее время Selena может проталкивать операторы, включая операторы бинарного сравнения (>, >=, =, < и <=), IN, IS NULL и BETWEEN ... AND .... Однако Selena не может проталкивать функции.

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

В настоящее время Selena может запрашивать только данные базовых типов в целевой базе данных, таких как NUMBER, STRING, TIME и DATE. Если диапазоны значений данных в целевой базе данных не поддерживаются Selena, запрос сообщает об ошибке.

Сопоставление между целевой базой данных и Selena зависит от типа целевой базы данных.

MySQL и Selena

MySQLSelena
BOOLEANBOOLEAN
TINYINTTINYINT
SMALLINTSMALLINT
MEDIUMINTINTINT
BIGINTBIGINT
FLOATFLOAT
DOUBLEDOUBLE
DECIMALDECIMAL
CHARCHAR
VARCHARVARCHAR
DATEDATE
DATETIMEDATETIME

Oracle и Selena

OracleSelena
CHARCHAR
VARCHARVARCHAR2VARCHAR
DATEDATE
SMALLINTSMALLINT
INTINT
BINARY_FLOATFLOAT
BINARY_DOUBLEDOUBLE
DATEDATE
DATETIMEDATETIME
NUMBERDECIMAL

PostgreSQL и Selena

PostgreSQLSelena
SMALLINTSMALLSERIALSMALLINT
INTEGERSERIALINT
BIGINTBIGSERIALBIGINT
BOOLEANBOOLEAN
REALFLOAT
DOUBLE PRECISIONDOUBLE
DECIMALDECIMAL
TIMESTAMPDATETIME
DATEDATE
CHARCHAR
VARCHARVARCHAR
TEXTVARCHAR

SQL Server и Selena

SQL ServerSelena
BOOLEANBOOLEAN
TINYINTTINYINT
SMALLINTSMALLINT
INTINT
BIGINTBIGINT
FLOATFLOAT
REALDOUBLE
DECIMALNUMERICDECIMAL
CHARCHAR
VARCHARVARCHAR
DATEDATE
DATETIMEDATETIME2DATETIME

Ограничения

  • При создании внешних таблиц JDBC вы не можете создавать индексы для таблиц или использовать PARTITION BY и DISTRIBUTED BY для указания правил распределения данных для таблиц.

  • При запросе внешних таблиц JDBC Selena не может проталкивать функции в таблицы.

(Устарело) Внешняя таблица Elasticsearch

Selena и Elasticsearch — две популярные аналитические системы. Selena производительна в крупномасштабных распределенных вычислениях. Elasticsearch идеален для полнотекстового поиска. Selena в сочетании с Elasticsearch может обеспечить более полное OLAP-решение.

Пример создания внешней таблицы Elasticsearch

Синтаксис

CREATE EXTERNAL TABLE elastic_search_external_table
(
k1 DATE,
k2 INT,
k3 SMALLINT,
k4 VARCHAR(2048),
k5 DATETIME
)
ENGINE=ELASTICSEARCH
PROPERTIES (
"hosts" = "http://192.168.0.1:9200,http://192.168.0.2:9200",
"user" = "root",
"password" = "root",
"index" = "tindex",
"type" = "_doc",
"es.net.ssl" = "true"
);

В следующей таблице описаны параметры.

ПараметрОбязательныйЗначение по умолчаниюОписание
hostsДаНетАдрес подключения кластера Elasticsearch. Вы можете указать один или несколько адресов. Selena может разобрать версию Elasticsearch и распределение шардов индекса по этому адресу. Selena взаимодействует с вашим кластером Elasticsearch на основе адреса, возвращаемого API-операцией GET /_nodes/http. Поэтому значение параметра host должно быть таким же, как адрес, возвращаемый API-операцией GET /_nodes/http. В противном случае BE могут не иметь возможности взаимодействовать с вашим кластером Elasticsearch.
indexДаНетИмя индекса Elasticsearch, созданного для таблицы в Selena. Имя может быть псевдонимом. Этот параметр поддерживает подстановочные знаки (*). Например, если вы установите index в hello*, Selena извлечет все индексы, имена которых начинаются с hello.
userНетПустоИмя пользователя, используемое для входа в кластер Elasticsearch с включенной базовой аутентификацией. Убедитесь, что у вас есть доступ к /*cluster/state/*nodes/http и индексу.
passwordНетПустоПароль, используемый для входа в кластер Elasticsearch.
typeНет_docТип индекса. Значение по умолчанию: _doc. Если вы хотите запрашивать данные в Elasticsearch 8 и более поздних версиях, вам не нужно настраивать этот параметр, поскольку типы сопоставления были удалены в Elasticsearch 8 и более поздних версиях.
es.nodes.wan.onlyНетfalseУказывает, использует ли Selena только адреса, указанные в hosts, для доступа к кластеру Elasticsearch и получения данных.
  • true: Selena использует только адреса, указанные в hosts, для доступа к кластеру Elasticsearch и получения данных и не обнюхивает узлы данных, на которых находятся шарды индекса Elasticsearch. Если Selena не может получить доступ к адресам узлов данных внутри кластера Elasticsearch, вам нужно установить этот параметр в true.
  • false: Selena использует адреса, указанные в host, для обнюхивания узлов данных, на которых находятся шарды индексов кластера Elasticsearch. После того как Selena генерирует план выполнения запроса, соответствующие BE напрямую обращаются к узлам данных внутри кластера Elasticsearch для получения данных из шардов индексов. Если Selena может получить доступ к адресам узлов данных внутри кластера Elasticsearch, мы рекомендуем сохранить значение по умолчанию false.
es.net.sslНетfalseУказывает, можно ли использовать протокол HTTPS для доступа к вашему кластеру Elasticsearch. Только Selena 2.4 и более поздние версии поддерживают настройку этого параметра.
  • true: Для доступа к вашему кластеру Elasticsearch можно использовать как протоколы HTTPS, так и HTTP.
  • false: Для доступа к вашему кластеру Elasticsearch можно использовать только протокол HTTP.
enable_docvalue_scanНетtrueУказывает, получать ли значения целевых полей из столбцового хранилища Elasticsearch. В большинстве случаев чтение данных из столбцового хранилища превосходит чтение данных из строкового хранилища.
enable_keyword_sniffНетtrueУказывает, обнюхивать ли поля типа TEXT в Elasticsearch на основе полей типа KEYWORD. Если этот параметр установлен в false, Selena выполняет сопоставление после токенизации.
Столбцовое сканирование для более быстрых запросов

Если вы установите enable_docvalue_scan в true, Selena следует этим правилам при получении данных из Elasticsearch:

  • Попробуй и посмотри: Selena автоматически проверяет, включено ли столбцовое хранилище для целевых полей. Если да, Selena получает все значения в целевых полях из столбцового хранилища.
  • Автоматическое понижение: Если любое из целевых полей недоступно в столбцовом хранилище, Selena разбирает и получает все значения в целевых полях из строкового хранилища (_source).

ПРИМЕЧАНИЕ

  • Столбцовое хранилище недоступно для полей типа TEXT в Elasticsearch. Поэтому, если вы запрашиваете поля, содержащие значения типа TEXT, Selena получает значения полей из _source.
  • Если вы запрашиваете большое количество (больше или равно 25) полей, чтение значений полей из docvalue не показывает заметных преимуществ по сравнению с чтением значений полей из _source.
Обнюхивание полей типа KEYWORD

Если вы установите enable_keyword_sniff в true, Elasticsearch позволяет прямое поглощение данных без индекса, поскольку он автоматически создаст индекс после поглощения. Для полей типа STRING Elasticsearch создаст поле как с типами TEXT, так и KEYWORD. Так работает функция Multi-Field в Elasticsearch. Сопоставление выглядит следующим образом:

"k4": {
"type": "text",
"fields": {
"keyword": {
"type": "keyword",
"ignore_above": 256
}
}
}

Например, для проведения фильтрации "=" по k4, Selena в Elasticsearch преобразует операцию фильтрации в TermQuery Elasticsearch.

Исходный SQL-фильтр выглядит следующим образом:

k4 = "StarRocks On Elasticsearch"

Преобразованный DSL-запрос Elasticsearch выглядит следующим образом:

"term" : {
"k4": "StarRocks On Elasticsearch"

}

Первое поле k4 имеет тип TEXT и будет токенизировано анализатором, настроенным для k4 (или стандартным анализатором, если анализатор не был настроен для k4) после поглощения данных. В результате первое поле будет токенизировано на три термина: StarRocks, On и Elasticsearch. Подробности следующие:

POST /_analyze
{
"analyzer": "standard",
"text": "StarRocks On Elasticsearch"
}

Результаты токенизации следующие:

{
"tokens": [
{
"token": "starrocks",
"start_offset": 0,
"end_offset": 5,
"type": "<ALPHANUM>",
"position": 0
},
{
"token": "on",
"start_offset": 6,
"end_offset": 8,
"type": "<ALPHANUM>",
"position": 1
},
{
"token": "elasticsearch",
"start_offset": 9,
"end_offset": 11,
"type": "<ALPHANUM>",
"position": 2
}
]
}

Предположим, вы проводите запрос следующим образом:

"term" : {
"k4": "StarRocks On Elasticsearch"
}

В словаре нет термина, который соответствует термину StarRocks On Elasticsearch, и поэтому результат не будет возвращен.

Однако, если вы установили enable_keyword_sniff в true, Selena преобразует k4 = "StarRocks On Elasticsearch" в k4.keyword = "StarRocks On Elasticsearch" для соответствия семантике SQL. Преобразованный DSL-запрос StarRocks On Elasticsearch выглядит следующим образом:

"term" : {
"k4.keyword": "StarRocks On Elasticsearch"
}

k4.keyword имеет тип KEYWORD. Поэтому данные записываются в Elasticsearch как полный термин, что позволяет успешное сопоставление.

Сопоставление типов данных столбцов

При создании внешней таблицы необходимо указать типы данных столбцов во внешней таблице на основе типов данных столбцов в таблице Elasticsearch. В следующей таблице показано сопоставление типов данных столбцов.

ElasticsearchSelena
BOOLEANBOOLEAN
BYTETINYINT/SMALLINT/INT/BIGINT
SHORTSMALLINT/INT/BIGINT
INTEGERINT/BIGINT
LONGBIGINT
FLOATFLOAT
DOUBLEDOUBLE
KEYWORDCHAR/VARCHAR
TEXTCHAR/VARCHAR
DATEDATE/DATETIME
NESTEDCHAR/VARCHAR
OBJECTCHAR/VARCHAR
ARRAYARRAY

Примечание

  • Selena читает данные типа NESTED, используя функции, связанные с JSON.
  • Elasticsearch автоматически сглаживает многомерные массивы в одномерные массивы. Selena делает то же самое. Поддержка запроса данных ARRAY из Elasticsearch добавлена начиная с версии 1.5.0.

Проталкивание предикатов

Selena поддерживает проталкивание предикатов. Фильтры могут быть протолкнуты в Elasticsearch для выполнения, что улучшает производительность запросов. В следующей таблице перечислены операторы, которые поддерживают проталкивание предикатов.

Синтаксис SQLСинтаксис ES
=term query
interms query
>=, <=, >, <range
andbool.filter
orbool.should
notbool.must_not
not inbool.must_not + terms
esqueryES Query DSL

Примеры

Функция esquery используется для проталкивания запросов которые не могут быть выражены в SQL (таких как match и geoshape) в Elasticsearch для фильтрации. Первый параметр в функции esquery используется для связывания индекса. Второй параметр — это JSON-выражение базового Query DSL, которое заключено в скобки . JSON-выражение должно иметь только один корневой ключ, такой как match, geo_shape или bool.

  • запрос match
select * from es_table where esquery(k4, '{
"match": {
"k4": "StarRocks on elasticsearch"
}
}');
  • запрос, связанный с geo
select * from es_table where esquery(k4, '{
"geo_shape": {
"location": {
"shape": {
"type": "envelope",
"coordinates": [
[
13,
53
],
[
14,
52
]
]
},
"relation": "within"
}
}
}');
  • запрос bool
select * from es_table where esquery(k4, ' {
"bool": {
"must": [
{
"terms": {
"k1": [
11,
12
]
}
},
{
"terms": {
"k2": [
100
]
}
}
]
}
}');

Примечания по использованию

  • Elasticsearch версии ранее 5.x сканирует данные по-другому, чем версии позже 5.x. В настоящее время поддерживаются только версии позже 5.x.
  • Поддерживаются кластеры Elasticsearch с включенной HTTP-базовой аутентификацией.
  • Запрос данных из Selena может быть не таким быстрым, как прямой запрос данных из Elasticsearch, например, запросы, связанные с подсчетом. Причина в том, что Elasticsearch напрямую читает метаданные целевых документов без необходимости фильтрации реальных данных, что ускоряет запрос подсчета.

(Устарело) Внешняя таблица Hive

Перед использованием внешних таблиц Hive убедитесь, что JDK 1.8 установлен на ваших серверах.

Создание ресурса Hive

Ресурс Hive соответствует кластеру Hive. Вы должны настроить кластер Hive, используемый Selena, например, адрес метастора Hive. Вы должны указать ресурс Hive, который используется внешней таблицей Hive.

  • Создание ресурса Hive с именем hive0.
CREATE EXTERNAL RESOURCE "hive0"
PROPERTIES (
"type" = "hive",
"hive.metastore.uris" = "thrift://xx.xx.xx.xx:9083"
);
  • Просмотр ресурсов, созданных в Selena.
SHOW RESOURCES;
  • Удаление ресурса с именем hive0.
DROP RESOURCE "hive0";

Вы можете изменить hive.metastore.uris ресурса Hive в Selena 2.3 и более поздних версиях. Для получения дополнительной информации см. ALTER RESOURCE.

Создание базы данных

CREATE DATABASE hive_test;
USE hive_test;

Создание внешней таблицы Hive

Синтаксис

CREATE EXTERNAL TABLE table_name (
col_name col_type [NULL | NOT NULL] [COMMENT "comment"]
) ENGINE=HIVE
PROPERTIES (
"key" = "value"
);

Пример: Создание внешней таблицы profile_parquet_p7 в базе данных rawdata в кластере Hive, соответствующем ресурсу hive0.

CREATE EXTERNAL TABLE `profile_wos_p7` (
`id` bigint NULL,
`first_id` varchar(200) NULL,
`second_id` varchar(200) NULL,
`p__device_id_list` varchar(200) NULL,
`p__is_deleted` bigint NULL,
`p_channel` varchar(200) NULL,
`p_platform` varchar(200) NULL,
`p_source` varchar(200) NULL,
`p__city` varchar(200) NULL,
`p__province` varchar(200) NULL,
`p__update_time` bigint NULL,
`p__first_visit_time` bigint NULL,
`p__last_seen_time` bigint NULL
) ENGINE=HIVE
PROPERTIES (
"resource" = "hive0",
"database" = "rawdata",
"table" = "profile_parquet_p7"
);

Описание:

  • Столбцы во внешней таблице

    • Имена столбцов должны быть такими же, как имена столбцов в таблице Hive.
    • Порядок столбцов не обязательно должен быть таким же, как порядок столбцов в таблице Hive.
    • Вы можете выбрать только некоторые из столбцов в таблице Hive, но вы должны выбрать все столбцы ключей разделов.
    • Столбцы ключей разделов внешней таблицы не нужно указывать с помощью partition by. Они должны быть определены в том же списке описания, что и другие столбцы. Вам не нужно указывать информацию о разделах. Selena автоматически синхронизирует эту информацию из таблицы Hive.
    • Установите ENGINE в HIVE.
  • PROPERTIES:

    • hive.resource: используемый ресурс Hive.
    • database: база данных Hive.
    • table: таблица в Hive. view не поддерживается.
  • В следующей таблице описано сопоставление типов данных столбцов между Hive и Selena.

    Тип столбца HiveТип столбца SelenaОписание
    INT/INTEGERINT
    BIGINTBIGINT
    TIMESTAMPDATETIMEИнформация о точности и часовом поясе будет потеряна при преобразовании данных TIMESTAMP в данные DATETIME. Вам нужно преобразовать данные TIMESTAMP в данные DATETIME, которые не имеют смещения часового пояса на основе часового пояса в sessionVariable.
    STRINGVARCHAR
    VARCHARVARCHAR
    CHARCHAR
    DOUBLEDOUBLE
    FLOATFLOAT
    DECIMALDECIMAL
    ARRAYARRAY

Примечание:

  • В настоящее время поддерживаемые форматы хранения Hive — Parquet, ORC и CSV. Если формат хранения — CSV, кавычки не могут использоваться как escape-символы.
  • Поддерживаются форматы сжатия SNAPPY и LZ4.
  • Максимальная длина строкового столбца Hive, который можно запросить, составляет 1 МБ. Если строковый столбец превышает 1 МБ, он будет обработан как null-столбец.

Использование внешней таблицы Hive

Запрос общего количества строк profile_wos_p7.

select count(*) from profile_wos_p7;

Обновление кэшированных метаданных таблицы Hive

  • Информация о разделах Hive и связанная информация о файлах кэшируются в Selena. Кэш обновляется через интервалы, указанные в hive_meta_cache_refresh_interval_s. Значение по умолчанию — 7200. hive_meta_cache_ttl_s указывает продолжительность тайм-аута кэша, значение по умолчанию — 86400.
    • Кэшированные данные также могут быть обновлены вручную.
      1. Если раздел добавляется или удаляется из таблицы в Hive, вы должны выполнить команду REFRESH EXTERNAL TABLE hive_t для обновления метаданных таблицы, кэшированных в Selena. hive_t — это имя внешней таблицы Hive в Selena.
      2. Если данные в некоторых разделах Hive обновляются, вы должны обновить кэшированные данные в Selena, выполнив команду REFRESH EXTERNAL TABLE hive_t PARTITION ('k1=01/k2=02', 'k1=03/k2=04'). hive_t — это имя внешней таблицы Hive в Selena. 'k1=01/k2=02' и 'k1=03/k2=04' — это имена разделов Hive, данные которых обновлены.
      3. Когда вы выполняете REFRESH EXTERNAL TABLE hive_t, Selena сначала проверяет, совпадает ли информация о столбцах внешней таблицы Hive с информацией о столбцах таблицы Hive, возвращаемой Hive Metastore. Если схема таблицы Hive изменяется, например, добавление столбцов или удаление столбцов, Selena синхронизирует изменения с внешней таблицей Hive. После синхронизации порядок столбцов внешней таблицы Hive остается таким же, как порядок столбцов таблицы Hive, при этом столбец раздела является последним столбцом.
  • Когда данные Hive хранятся в формате Parquet, ORC и CSV, вы можете синхронизировать изменения схемы (такие как ADD COLUMN и REPLACE COLUMN) таблицы Hive с внешней таблицей Hive в Selena 2.3 и более поздних версиях.

Доступ к объектному хранилищу

  • Путь к файлу конфигурации FE — fe/conf, к которому можно добавить файл конфигурации, если вам нужно настроить кластер Hadoop. Например: Если кластер HDFS использует высокодоступный nameservice, вам нужно поместить hdfs-site.xml в fe/conf. Если HDFS настроен с ViewFs, вам нужно поместить core-site.xml в fe/conf.

  • Путь к файлу конфигурации BE — be/conf, к которому можно добавить файл конфигурации, если вам нужно настроить кластер Hadoop. Например, если кластер HDFS использует высокодоступный nameservice, вам нужно поместить hdfs-site.xml в be/conf. Если HDFS настроен с ViewFs, вам нужно поместить core-site.xml в be/conf.

  • На машине, где находится BE, настройте JAVA_HOME как среду JDK, а не среду JRE в стартовом скрипте BE bin/start_be.sh, например, export JAVA_HOME = <путь JDK>. Вы должны добавить эту конфигурацию в начало скрипта и перезапустить BE, чтобы конфигурация вступила в силу.

  • Настройка поддержки Kerberos:

    1. Для входа с kinit -kt keytab_path principal на все машины FE/BE вам нужен доступ к Hive и HDFS. Вход с помощью команды kinit действителен только в течение определенного времени и должен быть помещен в crontab для регулярного выполнения.
    2. Поместите hive-site.xml/core-site.xml/hdfs-site.xml в fe/conf и поместите core-site.xml/hdfs-site.xml в be/conf.
    3. Добавьте -Djava.security.krb5.conf=/etc/krb5.conf к значению опции JAVA_OPTS в файле $FE_HOME/conf/fe.conf. /etc/krb5.conf — это путь сохранения файла krb5.conf. Вы можете изменить путь в зависимости от вашей операционной системы.
    4. Напрямую добавьте JAVA_OPTS="-Djava.security.krb5.conf=/etc/krb5.conf" в файл $BE_HOME/conf/be.conf. /etc/krb5.conf — это путь сохранения файла krb5.conf. Вы можете изменить путь в зависимости от вашей операционной системы.
    5. При добавлении ресурса Hive вы должны передать доменное имя в hive.metastore.uris. Кроме того, вы должны добавить сопоставление между доменными именами Hive/HDFS и IP-адресами в файл /etc/hosts.
  • Настройка поддержки AWS S3: Добавьте следующую конфигурацию в fe/conf/core-site.xml и be/conf/core-site.xml.

    <configuration>
    <property>
    <name>fs.s3a.access.key</name>
    <value>******</value>
    </property>
    <property>
    <name>fs.s3a.secret.key</name>
    <value>******</value>
    </property>
    <property>
    <name>fs.s3a.endpoint</name>
    <value>s3.us-west-2.amazonaws.com</value>
    </property>
    <property>
    <name>fs.s3a.connection.maximum</name>
    <value>500</value>
    </property>
    </configuration>
    1. fs.s3a.access.key: идентификатор ключа доступа AWS.
    2. fs.s3a.secret.key: секретный ключ AWS.
    3. fs.s3a.endpoint: конечная точка AWS S3 для подключения.
    4. fs.s3a.connection.maximum: максимальное количество одновременных подключений от Selena к S3. Если во время запроса возникает ошибка Timeout waiting for connection from poll, вы можете установить этот параметр на большее значение.

(Устарело) Внешняя таблица Iceberg

Начиная с версии 1.5.0, Selena позволяет запрашивать данные из Apache Iceberg с помощью внешних таблиц. Для запроса данных в Iceberg необходимо создать внешнюю таблицу Iceberg в Selena. При создании таблицы необходимо установить сопоставление между внешней таблицей и таблицей Iceberg, которую вы хотите запросить.

Перед началом

Убедитесь, что Selena имеет разрешения на доступ к службе метаданных (например, Hive metastore), файловой системе (например, HDFS) и системе объектного хранения (например, Amazon S3 и Alibaba Cloud Object Storage Service), используемым Apache Iceberg.

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

  • Внешние таблицы Iceberg могут использоваться для запроса только следующих типов данных:

    • Таблицы Iceberg v1 (Analytic Data Tables). Таблицы Iceberg v2 (Row-level Deletes) в формате ORC поддерживаются начиная с версии 1.5.0, а таблицы Iceberg v2 в формате Parquet поддерживаются начиная с версии 1.5.0. Для различий между таблицами Iceberg v1 и таблицами Iceberg v2 см. Iceberg Table Spec.
    • Таблицы, которые сжаты в формате gzip (формат по умолчанию), Zstd, LZ4 или Snappy.
    • Файлы, которые хранятся в формате Parquet или ORC.
  • Внешние таблицы Iceberg в Selena 2.3 и более поздних версиях поддерживают синхронизацию изменений схемы таблицы Iceberg, в то время как внешние таблицы Iceberg в версиях ранее Selena 2.3 не поддерживают. Если схема таблицы Iceberg изменяется, вы должны удалить соответствующую внешнюю таблицу и создать новую.

Процедура

Шаг 1: Создание ресурса Iceberg

Перед созданием внешней таблицы Iceberg необходимо создать ресурс Iceberg в Selena. Ресурс используется для управления информацией о доступе к Iceberg. Кроме того, вам также нужно указать этот ресурс в операторе, который используется для создания внешней таблицы. Вы можете создать ресурс в зависимости от ваших бизнес-требований:

  • Если метаданные таблицы Iceberg получены из Hive metastore, вы можете создать ресурс и установить тип каталога в HIVE.

  • Если метаданные таблицы Iceberg получены из других служб, вам нужно создать пользовательский каталог. Затем создайте ресурс и установите тип каталога в CUSTOM.

Создание ресурса с типом каталога HIVE

Например, создайте ресурс с именем iceberg0 и установите тип каталога в HIVE.

CREATE EXTERNAL RESOURCE "iceberg0" 
PROPERTIES (
"type" = "iceberg",
"iceberg.catalog.type" = "HIVE",
"iceberg.catalog.hive.metastore.uris" = "thrift://xx.xx.xx.xx:9083"
);

В следующей таблице описаны связанные параметры.

ПараметрОписание
typeТип ресурса. Установите значение iceberg.
iceberg.catalog.typeТип каталога ресурса. Поддерживаются как каталог Hive, так и пользовательский каталог. Если вы указываете каталог Hive, установите значение HIVE. Если вы указываете пользовательский каталог, установите значение CUSTOM.
iceberg.catalog.hive.metastore.urisURI Hive metastore. Значение параметра имеет следующий формат: thrift://< IP-адрес метаданных Iceberg >:< номер порта >. Номер порта по умолчанию — 9083. Apache Iceberg использует каталог Hive для доступа к Hive metastore, а затем запрашивает метаданные таблиц Iceberg.
Создание ресурса с типом каталога CUSTOM

Пользовательский каталог должен наследовать абстрактный класс BaseMetastoreCatalog, и вам нужно реализовать интерфейс IcebergCatalog. Кроме того, имя класса пользовательского каталога не может дублироваться с именем класса, который уже существует в Selena. После создания каталога упакуйте каталог и связанные с ним файлы и поместите их в путь fe/lib каждого frontend (FE). Затем перезапустите каждый FE. После завершения предыдущих операций вы можете создать ресурс, каталог которого является пользовательским каталогом.

Например, создайте ресурс с именем iceberg1 и установите тип каталога в CUSTOM.

CREATE EXTERNAL RESOURCE "iceberg1" 
PROPERTIES (
"type" = "iceberg",
"iceberg.catalog.type" = "CUSTOM",
"iceberg.catalog-impl" = "com.starrocks.IcebergCustomCatalog"
);

В следующей таблице описаны связанные параметры.

ПараметрОписание
typeТип ресурса. Установите значение iceberg.
iceberg.catalog.typeТип каталога ресурса. Поддерживаются как каталог Hive, так и пользовательский каталог. Если вы указываете каталог Hive, установите значение HIVE. Если вы указываете пользовательский каталог, установите значение CUSTOM.
iceberg.catalog-implПолное имя класса пользовательского каталога. FE ищут каталог на основе этого имени. Если каталог содержит пользовательские элементы конфигурации, вы должны добавить их в параметр PROPERTIES как пары ключ-значение при создании внешней таблицы Iceberg.

Вы можете изменить hive.metastore.uris и iceberg.catalog-impl ресурса Iceberg в Selena 2.3 и более поздних версиях. Для получения дополнительной информации см. ALTER RESOURCE.

Просмотр ресурсов Iceberg
SHOW RESOURCES;
Удаление ресурса Iceberg

Например, удалите ресурс с именем iceberg0.

DROP RESOURCE "iceberg0";

Удаление ресурса Iceberg делает все внешние таблицы, которые ссылаются на этот ресурс, недоступными. Однако соответствующие данные в Apache Iceberg не удаляются. Если вам все еще нужно запрашивать данные в Apache Iceberg, создайте новый ресурс и новую внешнюю таблицу.

Шаг 2: (Необязательно) Создание базы данных

Например, создайте базу данных с именем iceberg_test в Selena.

CREATE DATABASE iceberg_test; 
USE iceberg_test;

Примечание: Имя базы данных в Selena может отличаться от имени базы данных в Apache Iceberg.

Шаг 3: Создание внешней таблицы Iceberg

Например, создайте внешнюю таблицу Iceberg с именем iceberg_tbl в базе данных iceberg_test.

CREATE EXTERNAL TABLE `iceberg_tbl` ( 
`id` bigint NULL,
`data` varchar(200) NULL
) ENGINE=ICEBERG
PROPERTIES (
"resource" = "iceberg0",
"database" = "iceberg",
"table" = "iceberg_table"
);

В следующей таблице описаны связанные параметры.

ПараметрОписание
ENGINEИмя движка. Установите значение ICEBERG.
resourceИмя ресурса Iceberg, на который ссылается внешняя таблица.
databaseИмя базы данных, к которой принадлежит таблица Iceberg.
tableИмя таблицы Iceberg.

Примечание:

  • Имя внешней таблицы может отличаться от имени таблицы Iceberg.

  • Имена столбцов внешней таблицы должны быть такими же, как в таблице Iceberg. Порядок столбцов двух таблиц может быть разным.

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

CREATE EXTERNAL TABLE `iceberg_tbl` ( 
`id` bigint NULL,
`data` varchar(200) NULL
) ENGINE=ICEBERG
PROPERTIES (
"resource" = "iceberg0",
"database" = "iceberg",
"table" = "iceberg_table",
"custom-catalog.properties" = "my_property"
);

При создании внешней таблицы необходимо указать типы данных столбцов во внешней таблице на основе типов данных столбцов в таблице Iceberg. В следующей таблице показано сопоставление типов данных столбцов.

Таблица IcebergВнешняя таблица Iceberg
BOOLEANBOOLEAN
INTTINYINT / SMALLINT / INT
LONGBIGINT
FLOATFLOAT
DOUBLEDOUBLE
DECIMAL(P, S)DECIMAL
DATEDATE / DATETIME
TIMEBIGINT
TIMESTAMPDATETIME
STRINGSTRING / VARCHAR
UUIDSTRING / VARCHAR
FIXED(L)CHAR
BINARYVARCHAR
LISTARRAY

Selena не поддерживает запрос данных Iceberg, тип данных которых TIMESTAMPTZ, STRUCT и MAP.

Шаг 4: Запрос данных в Apache Iceberg

После создания внешней таблицы вы можете запрашивать данные в Apache Iceberg с помощью внешней таблицы.

select count(*) from iceberg_tbl;

(Устарело) Внешняя таблица Hudi

Начиная с версии 1.5.0, Selena позволяет запрашивать данные из озер данных Hudi с помощью внешних таблиц Hudi, что способствует молниеносной аналитике озер данных. В этой теме описывается, как создать внешнюю таблицу Hudi в вашем кластере Selena и использовать внешнюю таблицу Hudi для запроса данных из озера данных Hudi.

Перед началом

Убедитесь, что вашему кластеру Selena предоставлен доступ к Hive metastore, кластеру HDFS или корзине, с помощью которых вы можете регистрировать таблицы Hudi.

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

  • Внешние таблицы Hudi для Hudi доступны только для чтения и могут использоваться только для запросов.
  • Selena поддерживает запрос таблиц Copy on Write и Merge On Read (таблицы MOR поддерживаются начиная с версии 1.5.0). Для различий между этими двумя типами таблиц см. Table & Query Types.
  • Selena поддерживает следующие два типа запросов Hudi: Snapshot Queries и Read Optimized Queries (Hudi поддерживает только выполнение Read Optimized Queries для таблиц Merge On Read). Incremental Queries не поддерживаются. Для получения дополнительной информации о типах запросов Hudi см. Table & Query Types.
  • Selena поддерживает следующие форматы сжатия для файлов Hudi: gzip, zstd, LZ4 и Snappy. Формат сжатия по умолчанию для файлов Hudi — gzip.
  • Selena не может синхронизировать изменения схемы из управляемых таблиц Hudi. Для получения дополнительной информации см. Schema Evolution. Если схема управляемой таблицы Hudi изменяется, вы должны удалить связанную внешнюю таблицу Hudi из вашего кластера Selena, а затем пересоздать эту внешнюю таблицу.

Процедура

Шаг 1: Создание и управление ресурсами Hudi

Вы должны создать ресурсы Hudi в вашем кластере Selena. Ресурсы Hudi используются для управления базами данных Hudi и внешними таблицами, которые вы создаете в вашем кластере Selena.

Создание ресурса Hudi

Выполните следующий оператор для создания ресурса Hudi с именем hudi0:

CREATE EXTERNAL RESOURCE "hudi0" 
PROPERTIES (
"type" = "hudi",
"hive.metastore.uris" = "thrift://xx.xx.xx.xx:9083"
);

В следующей таблице описаны параметры.

ПараметрОписание
typeТип ресурса Hudi. Установите значение hudi.
hive.metastore.urisThrift URI Hive metastore, к которому подключается ресурс Hudi. После подключения ресурса Hudi к Hive metastore вы можете создавать и управлять таблицами Hudi с помощью Hive. Thrift URI имеет формат <IP-адрес Hive metastore>:<Номер порта Hive metastore>. Номер порта по умолчанию — 9083.

Начиная с версии 1.5.0, Selena позволяет изменять значение hive.metastore.uris ресурса Hudi. Для получения дополнительной информации см. ALTER RESOURCE.

Просмотр ресурсов Hudi

Выполните следующий оператор для просмотра всех ресурсов Hudi, созданных в вашем кластере Selena:

SHOW RESOURCES;
Удаление ресурса Hudi

Выполните следующий оператор для удаления ресурса Hudi с именем hudi0:

DROP RESOURCE "hudi0";

Примечание:

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

Шаг 2: Создание баз данных Hudi

Выполните следующий оператор для создания и открытия базы данных Hudi с именем hudi_test в вашем кластере Selena:

CREATE DATABASE hudi_test; 
USE hudi_test;

Примечание:

Имя, которое вы указываете для базы данных Hudi в вашем кластере Selena, не обязательно должно совпадать с именем связанной базы данных в Hudi.

Шаг 3: Создание внешних таблиц Hudi

Выполните следующий оператор для создания внешней таблицы Hudi с именем hudi_tbl в базе данных Hudi hudi_test:

CREATE EXTERNAL TABLE `hudi_tbl` ( 
`id` bigint NULL,
`data` varchar(200) NULL
) ENGINE=HUDI
PROPERTIES (
"resource" = "hudi0",
"database" = "hudi",
"table" = "hudi_table"
);

В следующей таблице описаны параметры.

ПараметрОписание
ENGINEДвижок запросов внешней таблицы Hudi. Установите значение HUDI.
resourceИмя ресурса Hudi в вашем кластере Selena.
databaseИмя базы данных Hudi, к которой принадлежит внешняя таблица Hudi в вашем кластере Selena.
tableУправляемая таблица Hudi, с которой связана внешняя таблица Hudi.

Примечание:

  • Имя, которое вы указываете для внешней таблицы Hudi, не обязательно должно совпадать с именем связанной управляемой таблицы Hudi.

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

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

Типы данных, поддерживаемые HudiТипы данных, поддерживаемые Selena
BOOLEANBOOLEAN
INTTINYINT/SMALLINT/INT
DATEDATE
TimeMillis/TimeMicrosTIME
TimestampMillis/TimestampMicrosDATETIME
LONGBIGINT
FLOATFLOAT
DOUBLEDOUBLE
STRINGCHAR/VARCHAR
ARRAYARRAY
DECIMALDECIMAL

Примечание

Selena не поддерживает запрос данных типа STRUCT или MAP, а также не поддерживает запрос данных типа ARRAY в таблицах Merge On Read.

Шаг 4: Запрос данных из внешней таблицы Hudi

После создания внешней таблицы Hudi, связанной с определенной управляемой таблицей Hudi, вам не нужно загружать данные во внешнюю таблицу Hudi. Для запроса данных из Hudi выполните следующий оператор:

SELECT COUNT(*) FROM hudi_tbl;

(Устарело) Внешняя таблица MySQL

В схеме звезды данные обычно делятся на таблицы измерений и таблицы фактов. Таблицы измерений имеют меньше данных, но включают операции UPDATE. В настоящее время Selena не поддерживает прямые операции UPDATE (обновление может быть реализовано с помощью таблицы Unique Key). В некоторых сценариях вы можете хранить таблицы измерений в MySQL для прямого чтения данных.

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

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

Параметры:

  • host: адрес подключения базы данных MySQL
  • port: номер порта базы данных MySQL
  • user: имя пользователя для входа в MySQL
  • password: пароль для входа в MySQL
  • database: имя базы данных MySQL
  • table: имя таблицы в базе данных MySQL