

# AWS Glue で CSV データを使用する
<a name="schema-csv"></a>

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

## 引用符で囲まれた CSV データの処理
<a name="schema-csv-quotes"></a>

次の例のように、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](csv-serde.md)」を参照してください。

**AWS Glue コンソールでテーブルプロパティを編集するには**

1. AWS Glue コンソールのナビゲーションペインで、[**テーブル**] を選択します。

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

1. [**Edit table**] (テーブルを編集) ページで、以下の変更を行います。
   + [**Serialization lib**] (シリアル化ライブラリ) には `org.apache.hadoop.hive.serde2.OpenCSVSerde` を入力します。
   + **[Serde parameters]** (Serde パラメータ) には、`escapeChar`、`quoteChar`、および `separatorChar` の各キーに以下の値を入力します。
     + `escapeChar` には、バックスラッシュ (**\$1**) を入力します。
     + `quoteChar` には、二重引用符 (**"**) を入力します。
     + `separatorChar` には、カンマ (**,**) を入力します。

1. [**Save**] を選択します。

詳細については、「AWS Glue デベロッパーガイド」の「[テーブルの詳細の表示と編集](https://docs.aws.amazon.com/glue/latest/dg/console-tables.html#console-tables-details)」を参照してください。

AWS Glue テーブルプロパティをプログラムで更新することもできます。次の JSON 例にあるように、テーブル定義内の `SerDeInfo` ブロックを変更するために、AWS Glue の [UpdateTable](https://docs.aws.amazon.com/glue/latest/webapi/API_UpdateTable.html) API オペレーション、または [update-table](https://docs.aws.amazon.com/cli/latest/reference/glue/update-table.html) AWS CLI コマンドを使用します。

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

## ヘッダーを使用した CSV ファイルの処理
<a name="schema-csv-headers"></a>

`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 でのジョブの作成](https://docs.aws.amazon.com/glue/latest/dg/author-job-glue.html)」を参照してください。

次の例に示す 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")
```