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 コンソールでテーブルプロパティを編集するには
-
AWS Glue コンソールのナビゲーションペインで、[テーブル] を選択します。
-
編集するテーブルのリンクを選択した後、[Action] (アクション)、[Edit table] (テーブルの編集) の順に選択します。
-
[Edit table] (テーブルを編集) ページで、以下の変更を行います。
-
[Serialization lib] (シリアル化ライブラリ) には
org.apache.hadoop.hive.serde2.OpenCSVSerde
を入力します。 -
[Serde parameters] (Serde パラメータ) には、
escapeChar
、quoteChar
、およびseparatorChar
の各キーに以下の値を入力します。-
escapeChar
には、バックスラッシュ (\
) を入力します。 -
quoteChar
には、二重引用符 ("
) を入力します。 -
separatorChar
には、カンマ (,
) を入力します。
-
-
-
[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")