適用対象: Azure Database for PostgreSQL - フレキシブル サーバー
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_container
- BLOB コンテナーを作成します。
BLOB コンテナーを作成するには、次の Azure CLI を実行します。
az storage container create --account-name $storage_account --name $blob_container -o tsv
- ストレージ アカウントに割り当てられている 2 つのアクセス キーのいずれかをフェッチします。 後の手順で azure_storage.account_add の引数として渡す必要があるため、必ずaccess_keyの値をコピーしてください。
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 -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 Storage アカウントに対して、この特権が付与されます。 既定では、 azure_pg_admin
のメンバーにのみ azure_storage_admin
ロールが付与されます。
データが読み込まれるテーブルを作成する
ストレージ アカウントにアップロードした CSV ファイルの内容をインポートするテーブルを作成しましょう。 これを行うには、 PgAdmin
、 psql
、または好みのクライアントを使用して Azure Database for PostgreSQL フレキシブル サーバーのインスタンスに接続し、次のステートメントを実行します。
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 portal からストレージ アカウント名とそのアクセス キーの 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_name_prefix>
内のすべての既存の BLOB を一覧表示する方法を示します。
<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 Storage アカウント <container_name>
の BLOB コンテナー <account_name>
に存在する COPY
という名前の BLOB からのデータのインポートを示しています。
ソース ファイルのスキーマに一致するテーブルを作成します。
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
コマンドを使用して、events_exported.csv
という名前のテーブルから、Azure Storage アカウント <container_name>
の BLOB コンテナー <account_name>
に存在する COPY
という名前の BLOB にデータをエクスポートする方法を示しています。
ソース ファイルのスキーマに一致するテーブルを作成します。
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>
内の 1 つの特定の 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;
または、blob_get関数の後に AS
句を使用して、結果のスキーマを明示的 に 定義することもできます。
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 から読み取られたコンテンツの読み取り、フィルター処理、および変更
この例では、SQL テーブルに読み込む前に、BLOB からインポートされたコンテンツをフィルター処理して変更する可能性を示します。
<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_copyの結果 を options
引数に渡すことで、カスタム区切り記号とエスケープ文字を使用する方法を示します。
<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
関数は、1 つの特定の BLOB (この場合eventscopy.csv
) の内容を構成し、<container_name>
ストレージの参照されるコンテナー <account_name>
にアップロードします。 この例では、 blob_get
を使用して 5 行のセットを作成し、 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_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>');