ゼファーネットのロゴ

Amazon RedshiftUNLOADを使用してJSONデータをAmazonS3にエクスポートする

日付:

Amazonレッドシフト は、高速でスケーラブル、安全、および完全に管理されたクラウドデータウェアハウスであり、標準SQLを使用してすべてのデータを簡単かつ費用効果の高い方法で分析できます。 Amazon Redshiftは、他のクラウドデータウェアハウスよりも最大XNUMX倍優れた価格パフォーマンスを提供します。 何万人もの顧客がAmazonRedshiftを使用して、XNUMX日あたり数エクサバイトのデータを処理し、高性能ビジネスインテリジェンス(BI)レポート、ダッシュボードアプリケーション、データ探索、リアルタイム分析などの分析ワークロードを強化しています。

IoTデバイス、ソーシャルメディア、およびクラウドアプリケーションによって生成されるデータの量が増え続けるにつれて、組織は、最小限の洞察時間でこのデータを簡単かつコスト効率よく分析しようとしています。 このデータの膨大な量は半構造化形式で利用可能であり、アクセス可能にするため、または分析のために構造化データと統合するために、追加の抽出、変換、および読み込み(ETL)プロセスが必要です。 Amazon Redshiftは、最新のデータアーキテクチャを強化します。これにより、データウェアハウス、データレイク、運用データベース全体でデータをクエリして、他の方法では不可能な、より高速でより深い洞察を得ることができます。 最新のデータアーキテクチャを使用すると、半構造化形式でデータを保存できます。 Amazon シンプル ストレージ サービス (Amazon S3)データレイクし、AmazonRedshiftの構造化データと統合します。 これにより、このデータをサイロに固定するのではなく、他の分析アプリケーションや機械学習アプリケーションで利用できるようになります。

この投稿では、Amazon RedshiftのUNLOAD機能と、AmazonRedshiftクラスターからAmazonS3データレイク上のJSONファイルにデータをエクスポートする方法について説明します。

AmazonRedshiftのJSONサポート機能

COPY、UNLO​​AD、およびなどのAmazonRedshift機能 AmazonRedshiftスペクトラム データウェアハウスとデータレイクの間でデータを移動およびクエリできるようにします。

アンロード コマンドを使用すると、クエリ結果セットをテキスト、JSON、またはApacheParquetファイル形式でAmazonS3にエクスポートできます。 データウェアハウスから大きな結果セットを取得する必要がある場合にも、UNLO​​ADコマンドをお勧めします。 UNLOADは、AmazonRedshiftのコンピューティングノードからAmazonS3にデータを並行して処理およびエクスポートするため、ネットワークオーバーヘッドが削減され、多数の行を読み取る時間が短縮されます。 UNLOADでJSONオプションを使用すると、Amazon Redshiftは、クエリ結果の完全なレコードを表すJSONオブジェクトを含む各行を含むJSONファイルにアンロードします。 JSONファイルでは、AmazonRedshiftタイプが最も近いJSON表現としてアンロードされます。 たとえば、ブール値はtrueまたはfalseとしてアンロードされ、NULL値はnullとしてアンロードされ、タイムスタンプ値は文字列としてアンロードされます。 デフォルトのJSON表現が特定のユースケースに適していない場合は、次の方法で変更できます。 鋳造 UNLOADステートメントのSELECTクエリで目的のタイプに変更します。

さらに、有効なJSONオブジェクトを作成するには、クエリ結果の各列の名前が一意である必要があります。 クエリ結果の列名が一意でない場合、JSONUNLOADプロセスは失敗します。 これを回避するには、適切な列エイリアスを使用して、アンロードされている間、クエリ結果の各列が一意のままになるようにすることをお勧めします。 この動作については、この投稿の後半で説明します。

AmazonRedshiftを使用する スーパー データ型の場合、ローカルのAmazonRedshiftテーブルにJSON形式でデータを保存できます。 このようにして、ネットワークオーバーヘッドなしでデータを処理し、Amazon Redshiftスキーマプロパティを使用して、半構造化データをローカルに最適に保存およびクエリできます。 低レイテンシを実現することに加えて、クエリに強い一貫性、予測可能なクエリパフォーマンス、複雑なクエリサポート、進化するスキーマやスキーマレスデータの使いやすさが必要な場合は、SUPERデータ型を使用することもできます。 Amazon Redshiftは、クエリ結果にSUPER列が含まれている場合にネストされたJSONの書き込みをサポートします。

絶えず進化するスキーマを使用してデータを更新および維持することは困難な場合があり、分析パイプラインに追加のETLステップを追加します。 JSONファイル形式は、スキーマ定義のサポートを提供し、軽量であり、さまざまなサービス、ツール、およびテクノロジーによるデータ転送メカニズムとして広く使用されています。

アマゾンオープンサーチサービス(アマゾンエラスティックサーチサービスの後継) は、リアルタイムのアプリケーションモニタリング、ログ分析、Webサイト検索など、幅広いユースケースに使用される分散型のオープンソース検索および分析スイートです。 データ取り込みでサポートされているファイル形式としてJSONを使用します。 データをJSON形式でAmazonRedshiftからAmazonS3データレイクにネイティブにアンロードする機能により、データをさらに分析するためにAmazon OpenSearch Serviceに取り込む必要がある場合に、複雑さと追加のデータ処理手順が軽減されます。

これは、シームレスなデータ移動が、Amazon S3のデータレイク、Amazon Redshiftのデータウェアハウス、Amazon OpenSearchServiceやその他のJSON指向のダウンストリーム分析ソリューションを使用した検索とログ分析を備えた統合データプラットフォームの構築にどのように役立つかの一例です。 レイクハウスアプローチの詳細については、を参照してください。 AWSでレイクハウスアーキテクチャを構築する.

Amazon Redshift JSONUNLOADの例

この投稿では、次のさまざまなシナリオを紹介します。

  • –顧客データをJSON形式でAmazon S3にアンロードし、Apache Hiveの規則に従って、顧客の誕生月をパーティションキーとして、出力ファイルをパーティションフォルダーに分割します。 UNLOADコマンドのSELECTステートメントの列にいくつかの変更を加えます。
    • 変換 c_preferred_cust_flag 文字からブール値への列
    • から先頭と末尾のスペースを削除します c_first_name, c_last_name, c_email_address AmazonRedshift組み込み関数を使用した列 ブトリム
  • –データがパーティション化されていない状態でJSON形式のラインアイテムデータ(SUPER列を含む)をAmazonS3にアンロードします
  • – JSON形式のラインアイテムデータ(SUPER列を含む)をAmazon S3にアンロードし、Apache Hiveの規則に従って、顧客キーをパーティションキーとして、出力ファイルをパーティションフォルダーにパーティション化します。

最初の例では、 customer テーブルとデータ TPCDSデータセット。 SUPER列のあるテーブルを含む例では、 customer_orders_lineitem 以下の表とデータ チュートリアル.

例1:顧客データをエクスポートする

この例では、顧客テーブルとTPCDSデータセットのデータを使用しました。 データベーススキーマを作成し、 customer テーブルにデータをコピーしました。 次のコードを参照してください。

-- Created a new database
create schema json_unload_demo; -- created and populated customer table in the new schema create table json_unload_demo.customer
( c_customer_sk int4 not null , c_customer_id char(16) not null , c_current_cdemo_sk int4 , c_current_hdemo_sk int4 , c_current_addr_sk int4 , c_first_shipto_date_sk int4 , c_first_sales_date_sk int4 , c_salutation char(10) , c_first_name char(20) , c_last_name char(30) , c_preferred_cust_flag char(1) , c_birth_day int4 , c_birth_month int4 , c_birth_year int4 , c_birth_country varchar(20) , c_login char(13) , c_email_address char(50) , c_last_review_date_sk int4 , primary key (c_customer_sk)
) distkey(c_customer_sk); copy json_unload_demo.customer from 's3://redshift-downloads/TPC-DS/2.13/3TB/customer/' iam_role '<<AWS IAM role attached to your amazon redshift cluster>>' gzip delimiter '|' EMPTYASNULL;

デフォルトを作成できます AWS IDおよびアクセス管理 (IAM)AmazonRedshiftクラスターがAmazonS3の場所からコピーおよびアンロードするための役割。 詳細については、を参照してください。 Amazon RedshiftのデフォルトのIAMロールを使用して、他のAWSサービスへのアクセスを簡素化します.

この例では、1992年に誕生したすべての顧客の顧客データをJSON形式でパーティションなしでAmazonS3にアンロードしました。 UNLOADステートメントに次の変更を加えます。

  • 変換 c_preferred_cust_flag 文字からブール値への列
  • から先頭と末尾のスペースを削除します c_first_name, c_last_name, c_email_address を使用する列 btrim function
  • AmazonS3でエクスポートされるファイルの最大サイズを64MBに設定します

次のコードを参照してください。

unload ('SELECT c_customer_sk, c_customer_id , c_current_cdemo_sk , c_current_hdemo_sk , c_current_addr_sk , c_first_shipto_date_sk , c_first_sales_date_sk , c_salutation , btrim(c_first_name), btrim(c_last_name), c_birth_day , c_birth_month , c_birth_year , c_birth_country , c_last_review_date_sk, DECODE(c_preferred_cust_flag, ''Y'', TRUE, ''N'', FALSE)::boolean as c_preferred_cust_flag_bool, c_login, btrim(c_email_address) from customer where c_birth_year = 1992;')
to 's3://<<Your Amazon S3 Bucket>>/non-partitioned/non-super/customer/' FORMAT JSON partition by (c_birth_month) include
iam_role '<<AWS IAM role attached to your amazon redshift cluster>>'
MAXFILESIZE 64 MB;

UNLOADコマンドを実行すると、を使用した列がエラーになったため、エラーが発生しました。 btrim 関数はすべて次のようにエクスポートしようとしました btrim (これは、一緒に選択された複数の列に同じ関数が適用された場合のAmazon Redshiftのデフォルトの動作です)。 このエラーを回避するには、列ごとに一意の列エイリアスを使用する必要があります。 btrim 関数が使用されました。

を選択した場合 c_first_name, c_last_name, c_email_address 適用することによる列 btrim 機能と c_preferred_cust_flag、文字からブール値に変換できます。

次のクエリを実行しました AmazonRedshiftクエリエディターv2:

SELECT btrim(c_first_name) , btrim(c_last_name), btrim(c_email_address) , DECODE(c_preferred_cust_flag, 'Y', TRUE, 'N', FALSE)::boolean c_preferred_cust_flag_bool from customer where c_birth_year = 1992 limit 10; 

を使用したXNUMXつの列すべて btrim 機能は次のように設定されます btrim それぞれの列名の代わりに、出力結果に表示されます。

列エイリアスを使用しなかったため、UNLO​​ADでエラーが発生しました。

次のコードに列エイリアスを追加しました。

unload ('SELECT c_customer_sk, c_customer_id , c_current_cdemo_sk , c_current_hdemo_sk , c_current_addr_sk , c_first_shipto_date_sk , c_first_sales_date_sk , c_salutation , btrim(c_first_name) as c_first_name, btrim(c_last_name) as c_last_name, c_birth_day , c_birth_month , c_birth_year , c_birth_country , c_last_review_date_sk, DECODE(c_preferred_cust_flag, ''Y'', TRUE, ''N'', FALSE)::boolean as c_preferred_cust_flag_bool, c_login, btrim(c_email_address) as c_email_addr_trimmed from customer where c_birth_year = 1992;')
to 's3://<<Your Amazon S3 Bucket>>/non-partitioned/non-super/customer/' FORMAT JSON partition by (c_birth_month) include
iam_role '<<AWS IAM role attached to your amazon redshift cluster>>'
MAXFILESIZE 64 MB;

列エイリアスを追加した後、UNLO​​ADコマンドは正常に完了し、ファイルはAmazonS3の目的の場所にエクスポートされました。

次のスクリーンショットは、Apache Hiveの規則に従い、AmazonRedshiftからAmazonS3へのパーティションキーとして顧客の誕生月を使用して、出力ファイルをパーティションフォルダーにパーティション化するJSON形式でデータがアンロードされることを示しています。 customer 列で番号の横にあるXをクリックします。

Amazon S3 Selectを使用したクエリでは、アンロードされたAmazonS3のJSONファイル内のデータのスニペットが表示されます。

列のエイリアス c_first_name, c_last_name, c_email_addr_trimmed SELECTクエリに従ってJSONレコードに書き込まれました。 ブール値はに保存されました c_preferred_cust_flag_bool 同様に。

例2および3:SUPER列の使用

次のXNUMXつの例では、 customer_orders_lineitem テーブルとデータ。 作成しました customer_orders_lineitem 次のコードを使用してテーブルにデータをコピーします。

-- Created a new table with SUPER column CREATE TABLE JSON_unload_demo.customer_orders_lineitem
(c_custkey bigint
,c_name varchar
,c_address varchar
,c_nationkey smallint
,c_phone varchar
,c_acctbal decimal(12,2)
,c_mktsegment varchar
,c_comment varchar
,c_orders super
); -- Loaded data into the new table
COPY json_unload_demo.customer_orders_lineitem FROM 's3://redshift-downloads/semistructured/tpch-nested/data/json/customer_orders_lineitem'
IAM_ROLE '<<AWS IAM role attached to your amazon redshift cluster>>'
FORMAT JSON 'auto';

次に、いくつかのクエリを実行して、 customer_orders_lineitem テーブルのデータ:

select * from json_unload_demo.customer_orders_lineitem;

select c_orders from json_unload_demo.customer_orders_lineitem;

SELECT attr as attribute_name, val as object_value FROM json_unload_demo.customer_orders_lineitem c, c.c_orders o, UNPIVOT o AS val AT attr;

例2:パーティションなし

この例では、のすべての行をアンロードしました customer_orders_lineitem パーティションのないAmazonS3へのJSON形式のテーブル:

unload ('select * from json_unload_demo.customer_orders_lineitem;')
to 's3://<<Your Amazon S3 Bucket>>/non-partitioned/super/customer-order-lineitem/'
FORMAT JSON
iam_role '<<AWS IAM role attached to your amazon redshift cluster>>';

UNLOADコマンドを実行すると、データは目的のAmazonS3の場所で利用できるようになります。 次のスクリーンショットは、データがパーティションなしでJSON形式でAmazonRedshiftからAmazonS3にアンロードされることを示しています。 customer_orders_lineitem 列で番号の横にあるXをクリックします。

Amazon S3 Selectを使用したクエリでは、アンロードされたAmazonS3のJSONファイル内のデータのスニペットが表示されます。

例3:パーティションあり

この例では、のすべての行をアンロードしました customer_orders_lineitem Apache Hiveの規則に従い、Amazon S3へのパーティションキーとして顧客キーを使用して、出力ファイルをパーティションフォルダーにパーティション化するJSON形式のテーブル:

unload ('select * from json_unload_demo.customer_orders_lineitem;')
to 's3://<<Your Amazon S3 Bucket>>/partitioned/super/customer-order-lineitem-1/'
FORMAT JSON
partition by (c_custkey) include
iam_role '<<AWS IAM role attached to your amazon redshift cluster>>';

UNLOADコマンドを実行すると、データは目的のAmazonS3の場所で利用できるようになります。 次のスクリーンショットは、Apache Hiveの規則に従って、AmazonRedshiftからAmazonS3へのパーティションキーとして顧客キーを使用して、出力ファイルをパーティションフォルダーにパーティション化するJSON形式でデータがアンロードされることを示しています。 customer_orders_lineitem 列で番号の横にあるXをクリックします。

Amazon S3 Selectを使用したクエリでは、アンロードされたAmazonS3のJSONファイル内のデータのスニペットが表示されます。

まとめ

この投稿では、Amazon Redshift UNLOADコマンドを使用して、クエリの結果を3つ以上のJSONファイルにアンロードしてAmazonS3の場所に移動する方法を示しました。 また、データをアンロードするときに、選択したパーティションキーを使用してデータをパーティション化する方法も示しました。 この機能を使用して、AmazonRedshiftクラスターまたはAmazonRedshiftサーバーレスエンドポイントからAmazonSXNUMXにデータをJSONファイルにエクスポートして、データ処理を簡素化し、統合データ分析プラットフォームを構築できます。


著者について

ディパンカルクシャリ AWSのシニアアナリティクスソリューションアーキテクトです。

サヤリ・ジョジャン AWSのシニアアナリティクスソリューションアーキテクトです。 彼女は、データと分析に重点を置いて、AWSクラウド上でソリューションを設計および構築するために顧客と協力して7年の経験があります。

コーディカニンガム AWSのソフトウェア開発エンジニアであり、AmazonRedshiftのデータ取り込みに取り組んでいます。

スポット画像

最新のインテリジェンス

スポット画像