AWS Glue で CSV データを使用する - Amazon Athena

AWS Glue で CSV データを使用する

このページでは、AWS Glue を使用して、各列のデータ値を引用符で囲んだ CSV ファイルまたはヘッダー値を含む CSV ファイルからスキーマを作成する方法について説明します。

引用符で囲まれた CSV データの処理

次の例のように、CSV ファイルに二重引用符で囲まれたデータフィールドがあるとします。

"John","Doe","123-555-1231","John said \"hello\"" "Jane","Doe","123-555-9876","Jane said \"hello\""

引用符で囲まれた値を持つ CSV ファイルから作成されたテーブルに対して Athena でクエリを実行するには、AWS Glue で、OpenCSVSerDe を使用するようにテーブルプロパティを変更する必要があります。OpenCSV SerDe の詳細については、「CSV を処理するための Open CSV SerDe」を参照してください。

AWS Glue コンソールでテーブルプロパティを編集するには
  1. AWS Glue コンソールのナビゲーションペインで、[テーブル] を選択します。

  2. 編集するテーブルのリンクを選択した後、[Action] (アクション)、[Edit table] (テーブルの編集) の順に選択します。

  3. [Edit table] (テーブルを編集) ページで、以下の変更を行います。

    • [Serialization lib] (シリアル化ライブラリ) には org.apache.hadoop.hive.serde2.OpenCSVSerde を入力します。

    • [Serde parameters] (Serde パラメータ) には、escapeCharquoteChar、および separatorChar の各キーに以下の値を入力します。

      • escapeChar には、バックスラッシュ (\) を入力します。

      • quoteChar には、二重引用符 (") を入力します。

      • separatorChar には、カンマ (,) を入力します。

  4. [Save] を選択します。

詳細については、「AWS Glue デベロッパーガイド」の「テーブルの詳細の表示と編集」を参照してください。

AWS Glue テーブルプロパティをプログラムで更新することもできます。次の JSON 例にあるように、テーブル定義内の SerDeInfo ブロックを変更するために、AWS Glue の UpdateTable API オペレーション、または update-table AWS CLI コマンドを使用します。

"SerDeInfo": { "name": "", "serializationLib": "org.apache.hadoop.hive.serde2.OpenCSVSerde", "parameters": { "separatorChar": "," "quoteChar": "\"" "escapeChar": "\\" } },

ヘッダーを使用した CSV ファイルの処理

CREATE TABLE ステートメントを使用して Athena でテーブルを定義するときは、以下の例にあるように、skip.header.line.count テーブルプロパティを使用して CSV データ内のヘッダーを無視することができます。

... STORED AS TEXTFILE LOCATION 's3://amzn-s3-demo-bucket/csvdata_folder/'; TBLPROPERTIES ("skip.header.line.count"="1")

または、CSV のヘッダーを事前に削除して、ヘッダー情報が Athena のクエリ結果に含まれないようにすることもできます。そのためには、1 つの方法として AWS Glue ジョブを使用して ETL (抽出、変換、ロード) スクリプトを実行します。必要なスクリプトは、AWS Glue で PySpark Python ダイアレクトの拡張言語を使用して作成できます。詳細については、AWS Glue デベロッパーガイドの「AWS Glue でのジョブの作成」を参照してください。

次の例に示す AWS Glue スクリプトの関数では、from_options を使用して動的フレームを作成し、writeHeader フォーマットオプションを false に設定することで、ヘッダー情報を削除しています。

glueContext.write_dynamic_frame.from_options(frame = applymapping1, connection_type = "s3", connection_options = {"path": "s3://amzn-s3-demo-bucket/MYTABLEDATA/"}, format = "csv", format_options = {"writeHeader": False}, transformation_ctx = "datasink2")