次の例は、Azure Storage拡張機能の使用方法を学習するのに役立ちます。
Azure Storage アカウントを作成し、データを設定する
Azure Storage アカウントを作成します。 Azure Storage アカウントを作成するには、
<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_containerBLOB コンテナーを作成します。
BLOB コンテナーを作成するには、次の Azure CLI コマンドを実行します。
az storage container create --account-name $storage_account --name $blob_container -o tsvストレージ アカウントに割り当てられている 2 つのアクセス キーのいずれかを取得します。 アクセス キーの値は、後の手順で azure_storage.account_add の引数として渡す必要があるため、必ずコピーしてください。
2 つのアクセス キーの 1 つ目を取得するには、次の 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 -L -O https://github.com/Azure-Samples/azure-postgresql-storage-extension/raw/main/storage_extension_sample.parquet az storage blob upload-batch --account-name $storage_account --destination $blob_container --source . --pattern "storage_extension_sample.parquet" --account-key $access_key --overwrite --output none --only-show-errors curl -L -O https://github.com/Azure-Samples/azure-postgresql-storage-extension/raw/main/parquet_without_extension az storage blob upload-batch --account-name $storage_account --destination $blob_container --source . --pattern "parquet_without_extension" --account-key $access_key --overwrite --output none --only-show-errors curl -L -O https://github.com/Azure-Samples/azure-postgresql-storage-extension/raw/main/storage_extension_sample.csv az storage blob upload-batch --account-name $storage_account --destination $blob_container --source . --pattern "storage_extension_sample.csv" --account-key $access_key --overwrite --output none --only-show-errors curl -L -O https://github.com/Azure-Samples/azure-postgresql-storage-extension/raw/main/csv_without_extension az storage blob upload-batch --account-name $storage_account --destination $blob_container --source . --pattern "csv_without_extension" --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 Storage アカウントに対してこの特権が付与されます。 既定では、 azure_pg_admin のメンバーにのみ azure_storage_admin ロールが付与されます。
データを読み込むテーブルを作成する
ストレージ アカウントにアップロードしたファイルの内容をインポートするテーブルを作成します。 これを行うには、PostgreSQL for Visual Studio Code (プレビュー)、psql、PgAdmin、または任意のクライアントを使用して、Azure Database for PostgreSQLフレキシブル サーバーのインスタンスに接続し、次のステートメントを実行します。
CREATE TABLE IF NOT EXISTS sample_data (
id BIGINT PRIMARY KEY,
sample_text TEXT,
sample_integer INTEGER,
sample_timestamp TIMESTAMP
);
拡張機能を使用できるように準備する
続行する前に、次の点を確認してください。
ストレージ アカウントのアクセス キーを追加する
この例では、ストレージ アカウントへの参照と、そのストレージ アカウントのアクセス キーを追加する方法を示します。 ストレージ アカウントのコンテンツにアクセスするには、フレキシブル サーバーのインスタンスのazure_storage拡張機能Azure Database for PostgreSQLアクセス キーが必要です。
<account_name>をストレージ アカウントの名前に設定します。 前のスクリプトを使用した場合、この値は、これらのスクリプトで storage_account 環境変数に設定した値と一致する必要があります。
<access_key>ストレージ アカウントからフェッチした値に設定します。
SELECT azure_storage.account_add('<account_name>', '<access_key>');
ヒント
Azure ポータルからストレージ アカウント名とそのアクセス キーの 1 つを取得するには、ストレージ アカウントを検索します。 リソース メニューで、[ アクセス キー] を選択します。 ストレージ アカウント名をコピーし、key1 セクションからキーをコピーします。 最初にキーの横にある [表示 ] を選択する必要があります。
Azure Blob Storage リファレンスでユーザーまたはロールへのアクセスを許可する
この例では、<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 ステートメントを使用してデータをインポートする
次の例は、Azure Storage アカウント storage_extension_sample.parquetの BLOB コンテナー <container_name>に存在する<account_name>という名前の BLOB からデータをインポートする方法を示しています。 インポートでは、 COPY コマンドを使用します。
ソース ファイルのスキーマと一致するテーブルを作成します。
CREATE TABLE IF NOT EXISTS sample_data ( id BIGINT PRIMARY KEY, sample_text TEXT, sample_integer INTEGER, sample_timestamp TIMESTAMP );COPYステートメントを使用して、ターゲット テーブルにデータをコピーします。 形式は、ファイルの拡張子から Parquet として推論されます。TRUNCATE TABLE sample_data; COPY sample_data FROM 'https://<account_name>.blob.core.windows.net/<container_name>/storage_extension_sample.parquet';COPYステートメントを使用して、ターゲット テーブルにデータをコピーします。 エンコード形式はファイル拡張子から推論できないため、FORMATオプションを使用して明示的に指定します。TRUNCATE TABLE sample_data; COPY sample_data FROM 'https://<account_name>.blob.core.windows.net/<container_name>/parquet_without_extension' WITH (FORMAT 'parquet');COPYステートメントを使用して、ターゲット テーブルにデータをコピーします。 エンコード形式は、ファイル拡張子から推論できます。 ただし、HEADERSオプションを使用して、最初の行の列ヘッダーの存在を明示的に構成する必要があります。TRUNCATE TABLE sample_data; COPY sample_data FROM 'https://<account_name>.blob.core.windows.net/<container_name>/storage_extension_sample.csv' WITH (HEADERS);次の
SELECTステートメントを実行して、データがテーブルに読み込まれたことを確認します。SELECT * FROM sample_data LIMIT 100;
COPY TO ステートメントを使用してデータをエクスポートする
次の例では、 sample_data という名前のテーブルから、エンコード形式など、異なる名前と特性を持つ複数の BLOB にデータをエクスポートする方法を示します。 すべての BLOB は、Azure Storage アカウント <account_name>の BLOB コンテナー <container_name>に存在します。
COPY コマンドを使用してデータをエクスポートします。
ソース ファイルのスキーマと一致するテーブルを作成します。
CREATE TABLE IF NOT EXISTS sample_data ( id BIGINT PRIMARY KEY, sample_text TEXT, sample_integer INTEGER, sample_timestamp TIMESTAMP );ソース ファイルのスキーマと一致するテーブルを作成します。
COPYステートメントを使用して、ターゲット テーブルからデータをコピーします。 エンコード形式を Parquet にする必要があることを指定します。COPY sample_data TO 'https://<account_name>.blob.core.windows.net/<container_name>/storage_extension_sample_exported.parquet' WITH (FORMAT 'parquet');COPYステートメントを使用して、ターゲット テーブルからデータをコピーします。 エンコード形式を CSV にする必要があり、結果のファイルの最初の行に列ヘッダーが含まれていることを指定します。COPY sample_data TO 'https://<account_name>.blob.core.windows.net/<container_name>/storage_extension_sample_exported.csv' WITH (FORMAT 'csv', HEADERS);次の
SELECTステートメントを実行して、BLOB がストレージ アカウントに存在することを確認します。SELECT * FROM azure_storage.blob_list('<account_name>','<container_name>') WHERE path LIKE 'storage_extension_sample_exported%';
BLOB からコンテンツを読み取る
blob_get関数は、<account_name> ストレージの参照コンテナー <container_name>内の 1 つの特定の BLOB の内容を取得します。 データ blob_get 解析するには、 NULL::table_name形式で値を渡します。ここで、 table_name は、読み取る BLOB のスキーマと一致するテーブルを参照します。 この例では、最初に作成した sample_data テーブルを参照しています。
<account_name>をストレージ アカウントの名前に設定します。 前のスクリプトを使用した場合、この値は、これらのスクリプトで storage_account 環境変数に設定した値と一致する必要があります。
<container_name>を BLOB コンテナーの名前に設定します。 前のスクリプトを使用した場合、この値は、これらのスクリプトで blob_container 環境変数に設定した値と一致する必要があります。
<blob_name>、内容を読み取る BLOB の完全なパスに設定します。
この場合、BLOB を解析するデコーダーは、 .parquet ファイル拡張子から推論されます。
SELECT * FROM azure_storage.blob_get
('<account_name>'
,'<container_name>'
,'storage_extension_sample.parquet'
, NULL::sample_data)
LIMIT 5;
または、blob_get関数の後に AS 句を使用して、結果のスキーマを明示的 に 定義することもできます。
SELECT * FROM azure_storage.blob_get('<account_name>','<container_name>','storage_extension_sample.parquet')
AS res (
id BIGINT PRIMARY KEY,
sample_text TEXT,
sample_integer INTEGER,
sample_timestamp TIMESTAMP)
LIMIT 5;
BLOB から読み取られたコンテンツの読み取り、フィルター処理、および変更
この例では、BLOB からインポートされたコンテンツをフィルター処理して変更してから、SQL テーブルに読み込む方法を示します。
<account_name>をストレージ アカウントの名前に設定します。 前のスクリプトを使用した場合、この値は、これらのスクリプトで storage_account 環境変数に設定した値と一致する必要があります。
<container_name>を BLOB コンテナーの名前に設定します。 前のスクリプトを使用した場合、この値は、これらのスクリプトで blob_container 環境変数に設定した値と一致する必要があります。
SELECT concat('P-',id::text) FROM azure_storage.blob_get
('<account_name>'
,'<container_name>'
,'storage_extension_sample.parquet'
, NULL::sample_data)
WHERE sample_integer=780
LIMIT 5;
カスタム オプション (ヘッダー、列区切り記号、エスケープ文字) を使用してファイルからコンテンツを読み取る
この例では、options_copyの結果を options 引数に渡すことによって、カスタム区切り記号とエスケープ文字を使用する方法を示します。
<account_name>をストレージ アカウントの名前に設定します。 前のスクリプトを使用した場合、この値は、これらのスクリプトで storage_account 環境変数に設定した値と一致する必要があります。
<container_name>を BLOB コンテナーの名前に設定します。 前のスクリプトを使用した場合、この値は、これらのスクリプトで blob_container 環境変数に設定した値と一致する必要があります。
SELECT * FROM azure_storage.blob_get
('<account_name>'
,'<container_name>'
,'storage_extension_sample.csv'
,NULL::sample_data
,options := azure_storage.options_csv_get(header := 'true')
);
デコーダー オプションを使用する
この例では、 decoder オプションを使用する方法を示します。 デコーダー オプションを含めない場合、システムはファイルの拡張子から推論します。 ファイル名に拡張子がない場合、またはファイル名拡張子が、システムがファイルの内容を適切に解析する必要があるデコーダーに対応していない場合は、デコーダー引数を明示的に渡すことができます。
<account_name>をストレージ アカウントの名前に設定します。 前のスクリプトを使用した場合、この値は、これらのスクリプトで storage_account 環境変数に設定した値と一致する必要があります。
<container_name>を BLOB コンテナーの名前に設定します。 前のスクリプトを使用した場合、この値は、これらのスクリプトで blob_container 環境変数に設定した値と一致する必要があります。
SELECT * FROM azure_storage.blob_get
('<account_name>'
,'<container_name>'
,'parquet_without_extension'
, NULL::sample_data
, decoder := 'parquet')
LIMIT 5;
BLOB のコンテンツに対するコンピューティング集計
この例では、BLOB コンテナーに格納されている情報に対して集計操作を実行する方法を示します。BLOB の内容を PostgreSQL テーブルにインポートする必要はありません。
<account_name>をストレージ アカウントの名前に設定します。 前のスクリプトを使用した場合、この値は、これらのスクリプトで storage_account 環境変数に設定した値と一致する必要があります。
<container_name>を BLOB コンテナーの名前に設定します。 前のスクリプトを使用した場合、この値は、これらのスクリプトで blob_container 環境変数に設定した値と一致する必要があります。
SELECT sample_integer, COUNT(*) FROM azure_storage.blob_get
('<account_name>'
,'<container_name>'
,'storage_extension_sample.parquet'
, NULL::sample_data)
GROUP BY sample_integer
ORDER BY 2 DESC
LIMIT 5;
BLOB にコンテンツを書き込む
blob_put関数は、1 つの特定の BLOB (この場合sample_data_copy.parquet) の内容を構成し、<container_name> ストレージの参照されるコンテナー <account_name>にアップロードします。 この例では、blob_getを使用して 5 行のセットを作成し、sample_data_copy.parquetという名前の BLOB としてアップロードするblob_put集計関数に渡します。
<account_name>をストレージ アカウントの名前に設定します。 前のスクリプトを使用した場合、この値は、これらのスクリプトで storage_account 環境変数に設定した値と一致する必要があります。
<container_name>を BLOB コンテナーの名前に設定します。 前のスクリプトを使用した場合、この値は、これらのスクリプトで blob_container 環境変数に設定した値と一致する必要があります。
エンコード形式は、ファイル拡張子 .parquetに基づいて Parquet として推論されます。
SELECT azure_storage.blob_put
('<account_name>'
,'<container_name>'
,'sample_data_copy.parquet'
, top_5_sample_data)
FROM (SELECT * FROM sample_data LIMIT 5) AS top_5_sample_data;
エンコード形式は、ファイル拡張子 .csvに基づいて CSV として推論されます。
SELECT azure_storage.blob_put
('<account_name>'
,'<container_name>'
,'sample_data_copy.csv'
, top_5_sample_data)
FROM (SELECT * FROM sample_data LIMIT 5) AS top_5_sample_data;
エンコード形式は、ファイル拡張子がないため推論できないため、 parquetとして明示的に構成されています。 また、圧縮アルゴリズムは zstd に設定されます。
SELECT azure_storage.blob_put
('<account_name>'
,'<container_name>'
,'sample_parquet_data_copy_without_extension_with_zstd_compression'
, top_5_sample_data
,'parquet'
,'zstd')
FROM (SELECT * FROM sample_data LIMIT 5) AS top_5_sample_data;
Azure ストレージ アカウントへのすべての参照を一覧表示する
この例では、azure_storage拡張機能がこのデータベースで参照できるAzureストレージ アカウントと、各ストレージ アカウントへのアクセスに使用される認証の種類を確認する方法を示します。 また、azure_storage.account_user_add 関数を使用して、拡張機能によって提供される機能を通じてストレージ アカウントAzureアクセスするためのアクセス許可が付与されているユーザーまたはロールも表示されます。
SELECT * FROM azure_storage.account_list();
Azure Blob Storage リファレンスのユーザーまたはロールからのアクセスを取り消す
この例では、<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 Database for PostgreSQL Azure Database for PostgreSQL Azure Azure Database for PostgreSQL Azure Database for PostgreSQL - 拡張機能とモジュール