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

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

примечание

Функция внешних таблиц больше не рекомендуется, за исключением определенных редких случаев использования, и может быть объявлена устаревшей в будущих выпусках. Для управления и запроса данных из внешних источников данных в общих сценариях рекомендуется использовать External Catalog.

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

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

  • Начиная с v1.5.2, мы рекомендуем использовать JDBC catalog для запроса данных из Oracle и SQL Server.

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

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

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

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

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

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

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

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

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

# Создайте внешнюю таблицу в исходном cluster 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"
);

# Запишите данные из исходного cluster в целевой cluster путем записи данных во внешнюю таблицу 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 целевого cluster Selena.

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

    примечание

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

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

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

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

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

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

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

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

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

Исходный SQL фильтр следующий:

k4 = "Selena On Elasticsearch"

Преобразованный Elasticsearch query DSL следующий:

"term" : {
"k4": "Selena On Elasticsearch"

}

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

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

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

{
"tokens": [
{
"token": "selena",
"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": "Selena On Elasticsearch"
}

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

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

"term" : {
"k4.keyword": "Selena 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 добавлена с версии v1.5.2.

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

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": "Selena on elasticsearch"
}
}');
  • запрос, связанный с геолокацией
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.
  • Поддерживаются clusters Elasticsearch с включенной базовой HTTP-аутентификацией.
  • Запрос данных из Selena может быть не таким быстрым, как прямой запрос данных из Elasticsearch, например, запросы, связанные с count. Причина в том, что Elasticsearch напрямую читает метаданные целевых документов без необходимости фильтрации реальных данных, что ускоряет запрос count.

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

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

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

Ресурс Hive соответствует cluster Hive. Вы должны настроить cluster Hive, используемый Selena, например, адрес Hive metastore. Вы должны указать ресурс 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 в cluster 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 МБ, он будет обработан как нулевой столбец.

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

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

select count(*) from profile_wos_p7;

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

  • Информация о партициях Hive и соответствующая информация о файлах кэшируются в Selena. Кэш обновляется с интервалами, указанными hive_meta_cache_refresh_interval_s. Значение по умолчанию — 7200.
    • Кэшированные данные также могут быть обновлены вручную.
      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, в который может быть добавлен файл конфигурации, если вам нужно настроить cluster Hadoop. Например: если cluster HDFS использует высокодоступный nameservice, вам нужно поместить hdfs-site.xml в fe/conf. Если HDFS настроен с ViewFs, вам нужно поместить core-site.xml в fe/conf.

  • Путь к файлу конфигурации BE — be/conf, в который может быть добавлен файл конфигурации, если вам нужно настроить cluster Hadoop. Например, если cluster 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 access key ID.
    2. fs.s3a.secret.key: AWS secret key.
    3. fs.s3a.endpoint: конечная точка AWS S3 для подключения.
    4. fs.s3a.connection.maximum: максимальное количество одновременных подключений из Selena к S3. Если во время запроса возникает ошибка Timeout waiting for connection from poll, вы можете установить этот параметр в большее значение.

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

Начиная с v1.5.2, 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 поддерживаются начиная с v1.5.2, а таблицы Iceberg v2 в формате Parquet поддерживаются начиная с v1.5.2. Для различий между таблицами 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, вы можете создать ресурс и установить тип catalog в HIVE.

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

Создание ресурса с типом catalog HIVE

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

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

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

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

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

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

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

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

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

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

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

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

  • Внешние таблицы Hudi для Hudi предназначены только для чтения и могут использоваться только для запросов.
  • Selena поддерживает запрос таблиц Copy on Write и Merge On Read (таблицы MOR поддерживаются с версии v1.5.2). Для различий между этими двумя типами таблиц см. 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 из вашего cluster Selena, а затем повторно создать эту внешнюю таблицу.

Процедура

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

Вы должны создать ресурсы Hudi в вашем cluster Selena. Ресурсы Hudi используются для управления базами данных Hudi и внешними таблицами, которые вы создаете в вашем cluster 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.

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

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

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

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

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

DROP RESOURCE "hudi0";

Примечание:

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

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

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

CREATE DATABASE hudi_test;
USE hudi_test;

Примечание:

Имя, которое вы указываете для базы данных Hudi в вашем cluster 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 в вашем cluster Selena.
databaseИмя базы данных Hudi, к которой принадлежит внешняя таблица Hudi в вашем cluster 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