[2024/02/16] データ分析にはJSONではなく Parquetを使おう 上地 航平(うえち こうへい)
自己紹介 ■ 名前 上地 航平(うえち こうへい) ■ 経歴 (9年)スケボー業界→→(2年)クラウド運用・保守→→(1年目)開発 ■ 業務内容 社内業務の効率化・フォロー・自動化を担うサービスの開発と運用に従事 ■ 好きなAWSサービス CloudFormation イマ ココ
アジェンダ 「データ分析にはJSONではなくParquetを使おう」 ● ● ● 本日のゴール データ分析環境と課題 JSONとParquet(パーケット)データの違い ○ ○ ● ● ● 行指向と列指向について データ分析をする時に覚えておきたいファイルフォーマットの種類 JSONからParquetに変換する方法 Athenaクエリの結果比較 まとめ
本日のゴール 以下項目を理解する。 ● ● ● JSONとParquet(パーケット)の違い Parquet(パーケット)へ変換する方法 データ分析環境で採用するべきファイルフォーマット
データ分析環境と課題 ● 定期的にログデータがJSONフォーマットでS3バケットに蓄積されている。 ○ ● ● 日付(yyyy-mm-dd/)ごとにパーティション分類済 クエリ実行時間:2.89秒/日 データスキャン量:3.52MB/日 蓄積データは 日々増加する クエリのコストを減 少させたい ▼Athena でのパフォーマンスのチューニング データソース ログデータ JSON S3バケット/yyyy-mm-dd/ Athena AWSベストプラクティスではデータソースに、 Parquet(パーケット)のような列指向ファイルフォーマット を使用することで効率よくクエリできると記載されて いた。
あれ、 JSONは何指向...? 列指向... フォーマット...? なんだっけ
JSONとParquet(パーケット)データの違い ▼ データ分析をする時に覚えておきたいファイルフォーマットの種類 ★テキストフォーマット(例: JSON) ● これは人間が読むことができるフォーマットで、 小〜大規模なデータ交換を行う際にウェブアプリケーション上でよく用いられます。 ○ ○ リクエストパラメーターを JSONで渡す。 レスポンスデータとして JSONで受け取る。 —-------------------------------------------—-------------------------------------------—-------------------------------------------—-------------------------------------------—-------------------------------------------—-------------------------------------------—-------------------------------------------—---------------------------------- ★行指向フォーマット (例:Avro) ★列指向(カラムナ)フォーマット(例: Parquet) ● バイナリ型のデータで、 0と1の2進数で表記されています。 コンピューターの基本言語であるため、高速な処理が可能です。
JSONとParquet(パーケット)データの違い ▼ データ分析をする時に覚えておきたいファイルフォーマットの種類 ★テキストフォーマット(例: JSON) ● これは人間が読むことができるフォーマットで、 小〜大規模なデータ交換を行う際にウェブアプリケーション上でよく用いられます。 ○ ○ リクエストパラメーターを JSONで渡す。 レスポンスデータとして JSONで受け取る。 Athenaクエリでは JSONは行指向として扱われる。 —-------------------------------------------—-------------------------------------------—-------------------------------------------—-------------------------------------------—-------------------------------------------—-------------------------------------------—-------------------------------------------—---------------------------------- ★行指向フォーマット (例:Avro) ★列指向(カラムナ)フォーマット(例: Parquet) ● バイナリ型のデータで、 0と1の2進数で表記されています。 コンピューターの基本言語であるため、高速な処理が可能です。
行指向と列指向について 指向 ⚫ 行指向 特徴 データ格納方式: 1行ずつ連続したデータ 用途:★OLTP(オンライン・トランザクション・プロセッシング)処理 1回の操作で多くのカラム(列)を扱う必要のある処理 (例)1件のメールを受信する。 ⚫ 列指向 (カラムナ) from subject message_id timestamp … メールアドレス① 件名① aaaaaa 2023-12-01 00:00:00 … メールアドレス② 件名② bbbbbb 2023-12-01 01:11:00 … メールアドレス③ 件名③ cccccc 2023-12-01 02:22:00 … message_id timestamp データ格納方式: 1列ずつ連続したデータ 用途:★OLAP(オンライン・アナリティカル・プロセッシング)処理 広範囲のデータから特定のカラムを分析する処理 (例)特定のメールアドレスを検索する from subject … 9 メールアドレス① 件名① aaaaaa 2023-12-01 00:00:00 … メールアドレス② 件名② bbbbbb 2023-12-01 01:11:00 … メールアドレス③ 件名③ cccccc 2023-12-01 02:22:00 …
行指向と列指向について ▼ 列指向ストレージ(Parquet)の採用によるメリット ● ● 特定のカラムのみを読み込むことが可能 データスキャン量を削減 し、それにより クエリ実行時間の短縮が期待 できる。 ▼ 行指向と列指向の違い(まとめ) ● 行指向フォーマット( AvroやAthenaで扱うJSON)では、 ● 各行のデータ全体が保存 されるため、特定のカラムを抽出する際には全データを読み込む必要 が あります。 ● 列指向フォーマット( Parquet)では、 カラム単位でデータが保存されるため、必要なカラムのみを効率的に読み込むことができます。 ▶ 一体どのように、S3バケット内のJSONをParquetへ変換できるのか?
行指向と列指向について ▼ 列指向ストレージ(Parquet)の採用によるメリット ● ● 特定のカラムのみを読み込むことが可能 データスキャン量を削減 し、それにより クエリ実行時間の短縮が期待 できる。 ▼ 行指向と列指向の違い(まとめ) ● 行指向フォーマット( AvroやAthenaで扱うJSON)では、 ● 各行のデータ全体が保存 されるため、特定のカラムを抽出する際には全データを読み込む必要 が あります。 ● 列指向フォーマット( Parquet)では、 カラム単位でデータが保存されるため、必要なカラムのみを効率的に読み込むことができます。 ▶ 一体どのように、S3バケット内のJSONをParquetへ変換できるのか? 次ページで説明していきたいと思います!
AWS GlueとAmazon Athenaを使ってデータ分析コスト最適化 ▼JSONのソースデータをParquetに変換する具体的な方法について説明します。 【まず変換対象となるデータの種類について】 ● 今回S3バケットに蓄積されているJSONデータは、2種類に大別されます。 ○ 「これまで蓄積されている過去データ」 ○ 「これからも継続的に蓄積されるデータ」 【どのようにJSONからParquetに変換するのか】 ● 2つの方法が存在 1. Amazon AthenaのCREATE TABLE AS(CTAS)クエリ a. SELECTクエリの実行結果に基づいて、 新しいテーブルとそのデータファイルを S3に作成する機能 b. 出力形式はフォーマット指定可能。デフォルトでは Parquet c. 単発で変換したい場合などのユースケースに適している 2. AWS Glue a. PythonやScalaなどの言語でスクリプトとして記述でき、 ジョブとして実行する。 スケジュール機能もあり、 定期的に変換したい場合などのユースケースに適している。
AWS GlueとAmazon Athenaを使ってデータ分析コスト最適化 ▼JSONのソースデータをParquetに変換する具体的な方法について説明します。 【まず変換対象となるデータの種類について】 ● 今回S3バケットに蓄積されているJSONデータは、2種類に大別されます。 ○ 「これまで蓄積されている過去データ」 ○ 「これからも継続的に蓄積されるデータ」 【どのようにJSONからParquetに変換するのか】 ● 2つの方法が存在 1. Amazon AthenaのCREATE TABLE AS(CTAS)クエリ a. SELECTクエリの実行結果に基づいて、 新しいテーブルとそのデータファイルを S3に作成する機能 b. 出力形式はフォーマット指定可能。デフォルトでは Parquet c. 単発で変換したい場合などのユースケースに適している 2. AWS Glue 採 用 a. PythonやScalaなどの言語でスクリプトとして記述でき、 ジョブとして実行する。 スケジュール機能もあり、 定期的に変換したい場合などのユースケースに適している。
“列指向(Parquet)”へのデータ変換システム(構成図) データソース ログデータ JSON S3バケット Athena Parquet クエリ実行 出力 変換 AWS Glue S3バケット 日時ジョブ 14 列指向へのデータ変換システム Amazon Athena
Athenaクエリの結果比較
▶クエリの結果比較 - コスト最適化の効果
1日分の蓄積データに対する Athenaクエリの実行結果を比較します。
● 行指向でスキャンされるJSONのAthenaクエリ結果
○ クエリ実行時間 :
○ データスキャン量 :
2.857秒
3.52MB
● 列指向のParquetのAthenaクエリ結果
○ クエリ実行時間:
○ データスキャン量:
995ミリ秒
249.05KB
SELECT "message_id"
Athenaクエリ
FROM "message"
WHERE dt >= '2024-01-01' AND dt <=
'2024-01-01'
まとめ ● JSONとParquet(パーケット)の違い ○ JSON ■ ■ ○ Parquet ■ ■ ● バイナリフォーマット 列指向のため、読み取りたいカラムのみスキャン可能 Parquet(パーケット)へ変換する方法 ○ ① AWS Glue ■ ■ ○ ● テキストフォーマット Athenaでは行指向で全ての要素が読み取られる スケジュール機能が利用可能 定期的にデータ変換したい場合に適切です。 ② Amazon Athena :CREATE TABLE AS(CTAS)クエリ ■ 単発でデータ変換したい場合に適切です。 データ分析環境で採用するべきファイルフォーマット ○ Parquet