3
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

BeeXAdvent Calendar 2024

Day 3

AWS Glue Crawlerでカンマを含むCSVを読み込む

Last updated at Posted at 2024-12-02

この記事はBeeX Advent Calendar 2024の3日目の記事です。

はじめに

以下の記事のコメント欄にカンマを含むCSVを読み込む方法が書いてあったので試してみました。

概要

CSV等のファイルをS3に格納して、Glueを利用してメタデータをクローリングし、ETLを行って長期保管用のS3に格納するような処理を実装するケースがあると思います。
その中でメタデータをクローリングする際、意外にファイルの内容次第でうまく読み込めなかったりするケースがあります。
今回はカンマを区切り文字とするCSVファイル内の文字列にカンマが含まれている場合に、メタデータを想定通りクローリングする方法を検証したものになります。

作業内容

事象確認

まずは検証用のテストファイルを作ります。
普通はあり得ないと思いますが、以下のようなユーザー一覧CSVファイルがあるとします。
favoriteカラムには好きな果物を入れていますが、人によっては複数あるのでカラム区切りで設定されています。
image.png

テストファイルをS3バケットにアップロードします。
image.png

Glueコンソールからデータベースを手動で作成しておきます。
image.png

先ほどテストファイルをアップロードしたS3バケットを指定するようにGlue Crawlerを作成します。
image.png

作成したらCrawlerを実行して正常終了することを確認します。
image.png

先ほど作成したデータベース配下にテーブルが自動で作成されています。
image.png

テーブルの詳細を見るとSchemaがおかしいことが分かります。
image.png

試しにAthenaでクエリを投げてみると、「peach,orange」の部分のカンマが区切り文字として判定されてカラムが増えています。
image.png

このようにデータにカンマ等の区切り文字が含まれる場合、想定外の処理が行われる可能性があります。

ダブルクォーテーションを付けた場合(NGのケース)

次もあまりないケースかと思いますが、カンマが含まれる文字列だけをダブルクォーテーションで囲った場合はどうなるでしょうか。
image.png

設定項目は先ほどと同じですので、S3への上書きアップロードしてGlue Crawlerを実行してみます。
image.png
image.png

Glue テーブルを見るとSchemaが4つに変わっているので、スキーマの判定は想定通りになってそうです。
image.png

じゃあAthenaでクエリするとどうなるかというと、test-user4のfavoriteカラムの表示が「"peach」となっているので、「,orange"」の部分が表示されていないことがわかります。
スキーマはちゃんと判定されていても文字内のカラムは区切り文字として判定されてしまっていました。
image.png

CSVファイルのデータを利用してGlueテーブルを作成する場合、Open CSV SerDeかLazy Simple SerDeのライブラリを利用する必要があります。
このうち、データにダブルクォーテーションが含まれる場合はOpen CSV SerDeを利用する必要があります。

GlueテーブルのAdvanced propertiesを見るとどちらのSerDeを利用しているか確認ができます。
デフォルトではLazy Simple SerDeを利用するように設定されています。
これではダブルクォーテーションで囲まれた値は正しく認識されません。
image.png

次はOpen CSV SerDeを利用するようにCrawlerを変更して取り込みしてみます。

ダブルクォーテーションを付けた場合(OKのケース)

CSVファイルのデータに対してOpen CSV SerDeを利用したい場合はGlueのカスタム分類子の機能を利用します。
https://docs.aws.amazon.com/ja_jp/glue/latest/dg/custom-classifier.html#custom-classifier-csv

GlueコンソールからClassifiers(分類子)を新規作成して、Classifier typeをCSV、CSV SerdeをOpen CSV SerDeのみ設定して作成します。
他の項目はデフォルトで問題ありません。
image.png

次に最初に作成したCrawlerのEditから編集画面に遷移し、データソースと分類子の設定画面から作成した分類子を指定して保存します。
image.png

Crawlerに差分判定させるために同じファイルをアップロードして、Crawlerを実行してみます。
image.png
image.png

Crawlerは正常終了しましたがAthenaからクエリすると先ほどと同じ結果となりました。
image.png

これはテーブルをみていただくとわかりますが、「Serde serialization lib」がLazy Simple SerDeのままになっていることが原因です。
image.png

テーブルの再作成をすることでOpen CSV SerDeに変更することもできますが、新しいCSVファイルをアップロードしてCrawlerを実行させることで簡単に変更が可能です。
image.png
image.png
image.png

先ほどは「"peach」としか出力されてませんでしたが、今度は「peach,orange」と出力されました。
追加したtest-user6のfavoriteカラムも正常に出力されてます。
image.png

おわりに

このようにAWS Glue Crawlerでカンマを含むCSVを取り込む際は少し注意が必要になります。

※あるべきとしては、そもそもカンマのような処理に影響がある文字が入らないようにデータ連携元と調整するか、取り込み前にS3→Lambda等で事前に前処理を入れる方が良いとは思います

できることは知っていましたが、たまたま検証する機会があったので記事に書いてみました。
この記事がどなたかの参考になれば幸いです。

参考URL

https://qiita.com/kmats@github/items/e320f3fbdd9b4b5cbe45
https://dev.classmethod.jp/articles/double-quotation-csv-glue-crawler-athena/

3
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?