Примечание
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Область применения:
Azure Cosmos DB для PostgreSQL (на базе расширения Citus для PostgreSQL)
В этой статье показано, как использовать расширение PostgreSQL pg_azure_storage для управления данными и загрузки данных в Azure Cosmos DB для PostgreSQL непосредственно из Azure Blob Storage (ABS). ABS — это облачная масштабируемая, устойчивая и безопасная служба хранения. Эти характеристики делают его хорошим выбором для хранения и перемещения существующих данных в облако.
Подготовка базы данных и хранилища блочных данных
Чтобы загрузить данные из облачного хранилища Azure Blob, установите расширение pg_azure_storage
PostgreSQL в базе данных.
SELECT * FROM create_extension('azure_storage');
Внимание
Расширение pg_azure_storage доступно только в кластерах Azure Cosmos DB для PostgreSQL, где используется PostgreSQL версии 13 или выше.
Мы подготовили общедоступный демонстрационный набор данных для этой статьи. Чтобы использовать собственный набор данных, следуйте инструкциям по переносу локальных данных в облачное хранилище, чтобы узнать, как эффективно использовать наборы данных в Хранилище BLOB-объектов Azure.
Примечание.
Если выбрать "Контейнер (анонимный доступ для чтения для контейнеров и BLOB-ов)", это позволит получать файлы из Хранилища BLOB-объектов Azure с помощью общедоступных URL-адресов и перечислять содержимое контейнера без необходимости настраивать ключ учетной записи в pg_azure_storage. Контейнеры, установленные для уровня доступа "Частный (без анонимного доступа)" или "BLOB (анонимный доступ только для чтения BLOB-объектов)", потребуют ключ доступа.
Список содержимого контейнера
Существует демонстрационный аккаунт и контейнер в Azure Blob Storage, которые были предварительно созданы для этого руководства. Имя контейнера — github
, и оно находится в учетной записи pgquickstart
. С помощью функции можно легко увидеть, какие файлы присутствуют в контейнере azure_storage.blob_list(account, container)
.
SELECT path, bytes, pg_size_pretty(bytes), content_type
FROM azure_storage.blob_list('pgquickstart','github');
-[ RECORD 1 ]--+-------------------
path | events.csv.gz
bytes | 41691786
pg_size_pretty | 40 MB
content_type | application/x-gzip
-[ RECORD 2 ]--+-------------------
path | users.csv.gz
bytes | 5382831
pg_size_pretty | 5257 kB
content_type | application/x-gzip
Вы можете отфильтровать выходные данные с помощью обычного предложения SQL WHERE
или с помощью prefix
параметра blob_list
UDF. Вторая фильтрует возвращаемые строки на стороне Azure Blob Storage.
Примечание.
Для перечисления содержимого контейнера требуется ключ учетной записи и доступа или контейнер с включенным анонимным доступом.
SELECT * FROM azure_storage.blob_list('pgquickstart','github','e');
-[ RECORD 1 ]----+---------------------------------
path | events.csv.gz
bytes | 41691786
last_modified | 2022-10-12 18:49:51+00
etag | 0x8DAAC828B970928
content_type | application/x-gzip
content_encoding |
content_hash | 473b6ad25b7c88ff6e0a628889466aed
SELECT *
FROM azure_storage.blob_list('pgquickstart','github')
WHERE path LIKE 'e%';
-[ RECORD 1 ]----+---------------------------------
path | events.csv.gz
bytes | 41691786
last_modified | 2022-10-12 18:49:51+00
etag | 0x8DAAC828B970928
content_type | application/x-gzip
content_encoding |
content_hash | 473b6ad25b7c88ff6e0a628889466aed
Загрузка данных из ABS
Загрузка данных с помощью команды COPY
Начните с создания примера схемы.
CREATE TABLE github_users
(
user_id bigint,
url text,
login text,
avatar_url text,
gravatar_id text,
display_login text
);
CREATE TABLE github_events
(
event_id bigint,
event_type text,
event_public boolean,
repo_id bigint,
payload jsonb,
repo jsonb,
user_id bigint,
org jsonb,
created_at timestamp
);
CREATE INDEX event_type_index ON github_events (event_type);
CREATE INDEX payload_index ON github_events USING GIN (payload jsonb_path_ops);
SELECT create_distributed_table('github_users', 'user_id');
SELECT create_distributed_table('github_events', 'user_id');
Загрузка данных в таблицы становится столь простой, как вызов команды COPY
.
-- download users and store in table
COPY github_users
FROM 'https://pgquickstart.blob.core.windows.net/github/users.csv.gz';
-- download events and store in table
COPY github_events
FROM 'https://pgquickstart.blob.core.windows.net/github/events.csv.gz';
Обратите внимание, как расширение распознало, что URL-адреса, предоставленные команде копирования, исходят из хранилища Blob-объектов Azure. Файлы, на которые мы указали, были сжаты в формате gzip, и это также было автоматически обработано для нас.
Эта COPY
команда поддерживает дополнительные параметры и форматы. В приведенном выше примере формат и сжатие были автоматически выбраны на основе расширений файлов. Однако вы можете указать формат, аналогичный обычной COPY
команде.
COPY github_users
FROM 'https://pgquickstart.blob.core.windows.net/github/users.csv.gz'
WITH (FORMAT 'csv');
В настоящее время расширение поддерживает следующие форматы файлов:
format | описание |
---|---|
csv | Формат разделенных запятыми значений, используемый PostgreSQL COPY |
tsv | Значения, разделенные символом табуляции, формат копирования PostgreSQL по умолчанию |
бинарный | Формат копирования двоичного postgreSQL |
text | Файл, содержащий одно текстовое значение (например, большой json или XML) |
Загрузка данных с помощью blob_get()
Команда удобна COPY
, но ограничена гибкостью. Внутренне COPY использует blob_get
функцию, которую можно использовать непосредственно, чтобы манипулировать данными в более сложных сценариях.
SELECT *
FROM azure_storage.blob_get(
'pgquickstart', 'github',
'users.csv.gz', NULL::github_users
)
LIMIT 3;
-[ RECORD 1 ]-+--------------------------------------------
user_id | 21
url | https://api.github.com/users/technoweenie
login | technoweenie
avatar_url | https://avatars.githubusercontent.com/u/21?
gravatar_id |
display_login | technoweenie
-[ RECORD 2 ]-+--------------------------------------------
user_id | 22
url | https://api.github.com/users/macournoyer
login | macournoyer
avatar_url | https://avatars.githubusercontent.com/u/22?
gravatar_id |
display_login | macournoyer
-[ RECORD 3 ]-+--------------------------------------------
user_id | 38
url | https://api.github.com/users/atmos
login | atmos
avatar_url | https://avatars.githubusercontent.com/u/38?
gravatar_id |
display_login | atmos
Примечание.
В приведенном выше запросе файл полностью извлекается до того, как LIMIT 3
будет применен.
С помощью этой функции можно управлять данными во время выполнения сложных запросов и выполнять импорт как INSERT FROM SELECT
.
INSERT INTO github_users
SELECT user_id, url, UPPER(login), avatar_url, gravatar_id, display_login
FROM azure_storage.blob_get('pgquickstart', 'github', 'users.csv.gz', NULL::github_users)
WHERE gravatar_id IS NOT NULL;
INSERT 0 264308
В приведенной выше команде мы отфильтровали данные для учетных записей с указанным и верхним регистром gravatar_id
для входа на лету.
Параметры blob_get()
В некоторых ситуациях может потребоваться управлять именно тем, что blob_get
нужно сделать с помощью decoder
compression
параметров и options
параметров.
Декодатор может иметь значение auto
(по умолчанию) или любое из следующих значений:
format | описание |
---|---|
csv | Формат разделенных запятыми значений, используемый PostgreSQL COPY |
tsv | Значения, разделенные табуляции, формат копирования PostgreSQL по умолчанию |
бинарный | Формат копирования двоичного postgreSQL |
текст | Файл, содержащий одно текстовое значение (например, большой json или XML) |
compression
может быть либо auto
(по умолчанию), none
либо gzip
.
Наконец, options
параметр имеет тип jsonb
. Существует четыре вспомогательных функции, которые помогают в создании значений для него.
Каждая служебная функция предназначена для декодера, соответствующего его имени.
дешифратор | Функция опций |
---|---|
csv | options_csv_get |
tsv | options_tsv |
двоичный | options_binary |
текст | options_copy |
Просмотрев определения функций, можно увидеть, какие параметры поддерживаются декодером.
options_csv_get
— разделитель, null_string, заголовок, цитата, escape, force_not_null, force_null, content_encoding options_tsv
— разделитель, null_string, content_encoding options_copy
— разделитель, null_string, заголовок, кавычки, escape-force_quote, force_not_null, force_null, content_encoding.
options_binary
- кодировка_контента
Зная выше, можно отменить записи с значением NULL gravatar_id
во время синтаксического анализа.
INSERT INTO github_users
SELECT user_id, url, UPPER(login), avatar_url, gravatar_id, display_login
FROM azure_storage.blob_get('pgquickstart', 'github', 'users.csv.gz', NULL::github_users,
options := azure_storage.options_csv_get(force_not_null := ARRAY['gravatar_id']));
INSERT 0 264308
Доступ к частному хранилищу
Получение имени учетной записи и ключа доступа
Без ключа доступа мы не будем разрешать перечислять контейнеры, для которых задано значение "Частный" или "Уровень доступа к BLOB-объектам".
SELECT * FROM azure_storage.blob_list('mystorageaccount','privdatasets');
ERROR: azure_storage: missing account access key HINT: Use SELECT azure_storage.account_add('<account name>', '<access key>')
В учетной записи хранения откройте ключи доступа. Скопируйте имя учетной записи хранения и скопируйте ключ из раздела key1 (сначала необходимо нажать "Показать" рядом с ключом).
Снимок экрана раздела "Безопасность + сеть. Ключи доступа" на странице Хранилище Blob в портале Azure.
Добавление учетной записи в pg_azure_storage
SELECT azure_storage.account_add('mystorageaccount', 'SECRET_ACCESS_KEY');
Теперь вы можете перечислить контейнеры, установленные на уровни доступа Private и Blob, для этого хранилища, но только как
citus
пользователь, которому предоставлена рольazure_storage_admin
. Если вы создадите пользователя с именемsupport
, по умолчанию доступ к содержимому контейнера не будет разрешен.SELECT * FROM azure_storage.blob_list('pgabs','dataverse');
ERROR: azure_storage: current user support is not allowed to use storage account pgabs
Разрешить
support
пользователю использовать определенную учетную запись хранилища Blob-объектов AzureПредоставление разрешения так же просто, как вызов
account_user_add
.SELECT * FROM azure_storage.account_user_add('mystorageaccount', 'support');
В выходных данных
account_list
можно увидеть разрешенных пользователей, в которых отображаются все учетные записи с определенными ключами доступа.SELECT * FROM azure_storage.account_list();
account_name | allowed_users ------------------+--------------- mystorageaccount | {support} (1 row)
Если вы когда-либо решите, что пользователь больше не должен иметь доступа. Просто позвоните
account_user_remove
.SELECT * FROM azure_storage.account_user_remove('mystorageaccount', 'support');
Следующие шаги
Поздравляем, вы только что узнали, как загружать данные в Azure Cosmos DB для PostgreSQL непосредственно из Azure Blob-хранилища.
- Узнайте, как создать панель мониторинга в режиме реального времени с помощью Azure Cosmos DB для PostgreSQL.
- Дополнительные сведения о pg_azure_storage.
- Узнайте о поддержке Postgres COPY.