以下の記事を参考にCSVファイルのデータをGlueで読み込ませようとしてましたが、Athenaを利用しない方法が調べても出てこなかったので試してみました。
dev.classmethod.jp
実施作業
準備
テストデータとして以下のCSVファイルを準備しました。
"番号","名前","場所" "1","田中太郎","日本/東京" "2","佐藤次郎","日本/大阪"
CSVファイルはGlueからクロールさせるS3パス内に格納しておきます。
Glue Crawler作成
対象のS3パスをクロールするGlue Crawlerを作成します。
- Crawler名
- データソース設定
- IAMロール・セキュリティ設定
- 出力設定・スケジュール設定
- 設定内容確認
Glue Crawler実行
作成したGlue Crawlerを手動で実行します。
エラーが出ていないことを確認します。
Glue DataCatalog・クエリ確認
Glue DataCatalogからテーブルを確認すると、テストデータのスキーマが登録されていることがわかります。
番号以外はstringとして識別されています。
Redshiftクラスターを構築し、以下のコマンドを実行して外部テーブルを作成します。
create external schema test_schema_1 from data catalog database 'test-db' iam_role 'arn:aws:iam::123456789123:role/testRedshiftRole';
以下のクエリを実行すると、番号カラムはNULLが表示され、名前カラムと場所カラムにはダブルクォーテーションが含まれてしまっていることが確認できます。
select * from test_schema_1.test_tab;
この番号カラムの値をNULLではなく正しい数字を表示させ、残りのカラムの値にダブルクォーテーションを含ませないようにさせるのが、今回のやりたいことになります。
Glue Table修正
修正内容としては冒頭にリンクした参考URL内に記載されており、以下の手順が必要となります。
・Serde シリアル化ライブラリを 「org.apache.hadoop.hive.serde2.OpenCSVSerde」 に変更
・Serde パラメータから 「field.delim : , 」を削除
・Serde パラメータに 「escapeChar : \」「quoteChar : "」 「separatorChar : , 」を追加
Glue Table画面のActionにある"Edit table"を押下します。
修正前は以下のようになっています。
手動で以下のように修正して、テーブルを保存します。
Glue Crawler実行・クエリ確認
テーブルを修正しただけでは反映されないため、再度Glue Crawlerを手動で実行します。
Glue Table画面上は何も変わったように見えませんが、
もう一度クエリを実行すると、すべてのカラムが想定通り表示されていることが確認できました。
感想及び所感
GlueでCSVファイルなどをクエリしたときに指定されるデフォルトのSerDeはLazySimpleSerDeですが、こちらではダブルクォーテーションで囲まれた値が含まれる場合に正常に認識できません。
ダブルクォーテーションで囲まれた値を認識させたいのであれば、OpenCSVSerDeを指定する必要があります。
Glueには分類子と呼ばれる、データ読み取り時にデータの形式を判定させるための仕組みがあるのですが、最初その仕組みを使って認識させようとしたところ何故かうまくいかなかったので、今回の手動で設定する方法と取りました。
docs.aws.amazon.com
この記事がどなたかの参考になれば幸いです。