你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn。
适用于: Azure Database for PostgreSQL - 灵活服务器
下面是一系列示例,可帮助你了解如何使用 Azure 存储扩展。
创建 Azure 存储帐户并使用数据填充它
- 创建 Azure 存储帐户。
若要创建 Azure 存储帐户,如果还没有帐户,请自定义值
<resource_group>
、<location>
、<account_name>
以及<container_name>
运行以下 Azure CLI 命令:random_suffix=$(tr -dc 'a-z0-9' </dev/urandom | head -c8) resource_group="resource-group-$random_suffix" location="eastus2" storage_account="storageaccount$random_suffix" blob_container="container-$random_suffix" az group create --name $resource_group --location $location az storage account create --resource-group $resource_group --name $storage_account --location $location --sku Standard_LRS --kind BlobStorage --public-network-access enabled --access-tier hot echo "Take note of the storage account name, which you'll have to replace in subsequent examples, whenever you find a reference to <account_name>:" echo $storage_account echo "Take note of the container name, which you'll have to replace in subsequent examples, whenever you find a reference to <container_name>:" echo $blob_container
- 创建 Blob 容器。
若要创建 Blob 容器,请运行以下 Azure CLI:
az storage container create --account-name $storage_account --name $blob_container -o tsv
- 提取分配给存储帐户的两个访问密钥之一。 请确保复制access_key的值,因为需要在后续步骤中将其作为参数传递给 azure_storage.account_add 。
若要提取两个访问密钥中的第一个,请运行以下 Azure CLI 命令:
access_key=$(az storage account keys list --resource-group $resource_group --account-name $storage_account --query [0].value) echo "Following is the value of your access key:" echo $access_key
- 下载包含示例期间使用的数据集的文件,并将其上传到 Blob 容器。
若要使用数据集下载文件,请运行以下 Azure CLI 命令:
mkdir --parents azure_storage_examples cd azure_storage_examples curl -O https://examples.citusdata.com/tutorial/events.csv gzip -k events.csv cp events.csv events_blob_without_extension cp events.csv events_pipe.csv cp events.csv.gz events_compressed sed -i 's/,/|/g' events_pipe.csv az storage blob upload-batch --account-name $storage_account --destination $blob_container --source . --pattern "events*" --account-key $access_key --overwrite --output none --only-show-errors
注释
可以列出特定存储帐户中存储的容器或 blob,但前提是 PostgreSQL 用户或角色通过使用 azure_storage.account_user_add 授予对该存储帐户的引用的权限。 角色的成员 azure_storage_admin
通过 azure_storage.account_add 添加的所有 Azure 存储帐户授予此权限。 默认情况下,仅向角色授予成员azure_pg_admin
azure_storage_admin
。
创建在其中加载数据的表
让我们创建一个表,将我们上传到存储帐户的 CSV 文件的内容导入其中。 为此,请使用首选项或客户端连接到 Azure Database for PostgreSQL 灵活服务器的PgAdmin
psql
实例,并执行以下语句:
CREATE TABLE IF NOT EXISTS 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 without time zone
);
准备扩展以供使用
在继续之前,请确保:
添加存储帐户的访问密钥
此示例演示如何添加对存储帐户的引用,以及该存储帐户的访问密钥,该存储帐户需要通过 Azure Database for PostgreSQL 灵活服务器实例中扩展提供 azure_storage
的功能访问其内容。
<account_name>
必须设置为存储帐户的名称。 如果使用了前面的脚本,此值应与在这些脚本中设置为storage_account环境变量的任何值匹配。
同样, <access_key>
必须设置为从存储帐户中提取的值。
SELECT azure_storage.account_add('<account_name>', '<access_key>');
小窍门
如果要从 Azure 门户检索存储帐户名称和其中一个访问密钥,请在资源菜单中选择“访问密钥”,复制存储帐户名称,然后从 key1 部分复制密钥(必须先选择“显示密钥”旁)。
授予对 Azure Blob 存储参考上的用户或角色的访问权限
此示例演示如何授予对命名 <regular_user>
用户或角色的访问权限,以便此类 PostgreSQL 用户可以使用 azure_storage
扩展来访问托管在引用的 Azure 存储帐户托管的容器中的 Blob。
<account_name>
必须设置为存储帐户的名称。 如果使用了前面的脚本,此值应与在这些脚本中设置为storage_account环境变量的任何值匹配。
<regular_user>
必须设置为现有用户或角色的名称。
SELECT * FROM azure_storage.account_user_add('<account_name>', '<regular_user>');
列出容器中的所有 Blob
此示例演示如何列出存储帐户<container_name>
容器<account_name>
中的所有现有 Blob。
<account_name>
必须设置为存储帐户的名称。 如果使用了前面的脚本,此值应与在这些脚本中设置为storage_account环境变量的任何值匹配。
<container_name>
必须设置为 Blob 容器的名称。 如果使用了前面的脚本,此值应与在这些脚本中设置为blob_container环境变量的任何值匹配。
SELECT * FROM azure_storage.blob_list('<account_name>','<container_name>');
列出具有特定名称前缀的 Blob
此示例演示如何列出存储帐户<container_name>
容器<account_name>
内的所有现有 blob,其 blob 名称以<blob_name_prefix>
其开头。
<account_name>
必须设置为存储帐户的名称。 如果使用了前面的脚本,此值应与在这些脚本中设置为storage_account环境变量的任何值匹配。
<container_name>
必须设置为 Blob 容器的名称。 如果使用了前面的脚本,此值应与在这些脚本中设置为blob_container环境变量的任何值匹配。
<blob_name_prefix>
应设置为要枚举 Blob 的任何前缀,以包含在其名称中。 如果要返回所有 Blob,可以将此参数设置为空字符串,甚至不指定此参数的值,在这种情况下,该值默认为空字符串。
SELECT * FROM azure_storage.blob_list('<account_name>','<container_name>','<blob_name_prefix>');
或者,可以使用以下语法:
SELECT * FROM azure_storage.blob_list('<account_name>','<container_name>') WHERE path LIKE '<blob_name_prefix>%';
使用 COPY FROM 语句导入数据
以下示例演示如何通过events.csv
命令从位于 Azure 存储帐户<container_name>
中的 Blob 容器<account_name>
中的 blob COPY
导入数据:
创建与源文件架构匹配的表:
CREATE TABLE IF NOT EXISTS 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 without time zone );
COPY
使用语句将数据复制到目标表中。 指定第一行包含列标题。COPY events FROM 'https://<account_name>.blob.core.windows.net/<container_name>/events.csv' WITH (FORMAT 'csv', header);
执行以下
SELECT
语句以确认数据已加载到表中。SELECT * FROM events LIMIT 100;
使用 COPY TO 语句导出数据
以下示例演示如何通过命令将数据从调用events
的表导出到驻留在 Azure 存储帐户events_exported.csv
中的 Blob 容器<container_name>
中的 blob<account_name>
:COPY
创建与源文件架构匹配的表:
CREATE TABLE IF NOT EXISTS 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 without time zone );
将数据加载到表中。 运行 INSERT 语句以使用多个合成行填充它,或使用 COPY FROM 语句示例的导入数据 来填充示例数据集的内容。
COPY
使用语句将数据复制到目标表中。 指定第一行包含列标题。COPY events TO 'https://<account_name>.blob.core.windows.net/<container_name>/events_exported.csv' WITH (FORMAT 'csv', header);
执行以下
SELECT
语句以确认 Blob 存在于存储帐户中。SELECT * FROM azure_storage.blob_list('<account_name>','<container_name>') WHERE path = 'events_exported.csv';
从 Blob 读取内容
该blob_get
函数在存储的引用容器events.csv
<container_name>
中检索一个特定 Blob(<account_name>
在本例中)的内容。 为了 blob_get
了解如何分析可在窗体 NULL::table_name
中传递值的数据,其中 table_name
引用的表的架构与所读取的 Blob 的架构匹配。 在此示例中,它指的是 events
我们在开始时创建的表。
<account_name>
必须设置为存储帐户的名称。 如果使用了前面的脚本,此值应与在这些脚本中设置为storage_account环境变量的任何值匹配。
<container_name>
必须设置为 Blob 容器的名称。 如果使用了前面的脚本,此值应与在这些脚本中设置为blob_container环境变量的任何值匹配。
<blob_name>
应设置为要读取其内容的 Blob 的完整路径。
SELECT * FROM azure_storage.blob_get
('<account_name>'
,'<container_name>'
,'events.csv'
, NULL::events)
LIMIT 5;
SELECT * FROM azure_storage.blob_get('<account_name>','<container_name>','events.csv.gz')
AS res (
event_id BIGINT
,event_type TEXT
,event_public BOOLEAN
,repo_id BIGINT
,payload JSONB
,repo JSONB
,user_id BIGINT
,org JSONB
,created_at TIMESTAMP WITHOUT TIME ZONE)
LIMIT 5;
读取、筛选和修改从 Blob 读取的内容
此示例演示了在将 Blob 导入的内容加载到 SQL 表中之前,可以筛选和修改导入的内容。
<account_name>
必须设置为存储帐户的名称。 如果使用了前面的脚本,此值应与在这些脚本中设置为storage_account环境变量的任何值匹配。
<container_name>
必须设置为 Blob 容器的名称。 如果使用了前面的脚本,此值应与在这些脚本中设置为blob_container环境变量的任何值匹配。
SELECT concat('P-',event_id::text) FROM azure_storage.blob_get
('<account_name>'
,'<container_name>'
,'events.csv'
, NULL::events)
WHERE event_type='PushEvent'
LIMIT 5;
使用自定义选项从文件中读取内容(标题、列分隔符、转义字符)
此示例演示如何通过将options_copyoptions
的结果传递给参数来使用自定义分隔符和转义字符。
<account_name>
必须设置为存储帐户的名称。 如果使用了前面的脚本,此值应与在这些脚本中设置为storage_account环境变量的任何值匹配。
<container_name>
必须设置为 Blob 容器的名称。 如果使用了前面的脚本,此值应与在这些脚本中设置为blob_container环境变量的任何值匹配。
SELECT * FROM azure_storage.blob_get
('<account_name>'
,'<container_name>'
,'events_pipe.csv'
,NULL::events
,options := azure_storage.options_csv_get(delimiter := '|' , header := 'true')
);
使用解码器选项
此示例演示了选项 decoder
的使用。 通常,格式是从文件的扩展名推断的,但是当文件内容没有匹配的扩展名时,可以传递解码器参数。
<account_name>
必须设置为存储帐户的名称。 如果使用了前面的脚本,此值应与在这些脚本中设置为storage_account环境变量的任何值匹配。
<container_name>
必须设置为 Blob 容器的名称。 如果使用了前面的脚本,此值应与在这些脚本中设置为blob_container环境变量的任何值匹配。
SELECT * FROM azure_storage.blob_get
('<account_name>'
,'<container_name>'
,'events_blob_without_extension'
, NULL::events
, decoder := 'csv')
LIMIT 5;
将压缩与解码器选项配合使用
此示例演示如何对名称不以.gz扩展名结尾的 gzip 压缩 blob 强制使用 gzip 压缩。
<account_name>
必须设置为存储帐户的名称。 如果使用了前面的脚本,此值应与在这些脚本中设置为storage_account环境变量的任何值匹配。
<container_name>
必须设置为 Blob 容器的名称。 如果使用了前面的脚本,此值应与在这些脚本中设置为blob_container环境变量的任何值匹配。
SELECT * FROM azure_storage.blob_get
('<account_name>'
,'<container_name>'
,'events_compressed'
, NULL::events
, decoder := 'csv'
, compression := 'gzip')
LIMIT 5;
基于 Blob 内容计算聚合
此示例演示如何对存储在 Blob 容器中的信息执行聚合作,而无需将 Blob 的内容导入 PostgreSQL 表。
<account_name>
必须设置为存储帐户的名称。 如果使用了前面的脚本,此值应与在这些脚本中设置为storage_account环境变量的任何值匹配。
<container_name>
必须设置为 Blob 容器的名称。 如果使用了前面的脚本,此值应与在这些脚本中设置为blob_container环境变量的任何值匹配。
SELECT event_type, COUNT(*) FROM azure_storage.blob_get
('<account_name>'
,'<container_name>'
,'events.csv'
, NULL::events)
GROUP BY event_type
ORDER BY 2 DESC
LIMIT 5;
将内容写入 Blob
该blob_put
函数构成一个特定 Blob 的内容(eventscopy.csv
在本例中),并将其上传到存储的<container_name>
引用容器<account_name>
。 此示例用于 blob_get
构造一组五行,然后传递给 blob_put
聚合函数,该函数将其作为名为 eventscopy.csv
blob 上传。
<account_name>
必须设置为存储帐户的名称。 如果使用了前面的脚本,此值应与在这些脚本中设置为storage_account环境变量的任何值匹配。
<container_name>
必须设置为 Blob 容器的名称。 如果使用了前面的脚本,此值应与在这些脚本中设置为blob_container环境变量的任何值匹配。
SELECT azure_storage.blob_put
('<account_name>'
,'<container_name>'
,'eventscopy.csv'
, top_5_events)
FROM (SELECT * FROM events) LIMIT 5) AS top_5_events;
列出对 Azure 存储帐户的所有引用
此示例说明如何找出扩展可在此数据库中引用哪些 Azure 存储帐户 azure_storage
,以及用于访问每个存储帐户的身份验证类型,以及通过 azure_storage.account_user_add 函数授予哪些用户或角色的权限,以通过扩展提供的功能访问该 Azure 存储帐户。
SELECT * FROM azure_storage.account_list();
从 Azure Blob 存储引用上的用户或角色撤消访问权限
此示例演示如何从命名 <regular_user>
的用户或角色撤消访问权限,以便此类 PostgreSQL 用户无法使用 azure_storage
扩展访问托管在引用的 Azure 存储帐户托管的容器中的 Blob。
<account_name>
必须设置为存储帐户的名称。 如果使用了前面的脚本,此值应与在这些脚本中设置为storage_account环境变量的任何值匹配。
<regular_user>
必须设置为现有用户或角色的名称。
SELECT * FROM azure_storage.account_user_remove('<account_name>', '<regular_user>');
删除对存储帐户的引用
此示例演示如何删除对存储帐户的任何引用,以便当前数据库中的任何用户都无法使用 azure_storage
扩展功能访问该存储帐户。
<account_name>
必须设置为存储帐户的名称。 如果使用了前面的脚本,此值应与在这些脚本中设置为storage_account环境变量的任何值匹配。
SELECT azure_storage.account_remove('<account_name>');
相关内容
- 排查错误。
- 参考。
- Azure 存储扩展。
- 配置 Azure 存储扩展。
- 扩展和模块。