🐥

glueで様々な文字コードのファイルを取り込む

2023/11/30に公開

概要


awsのサービスであるglueで様々なエンコードのファイル取り込み(etlプロセス)を行う機会があったのでどの様な方法で行ったかをまとめる。

前提


glueとは
 以下にある通り、複数のソースからデータを検出し、アプリケーションなどで使用することを容易にするETLパイプラインの開発を簡素化してくれたりする様なツールです。

AWS Glue は、サーバーレスなデータ統合サービスで、分析、機械学習 (ML)、アプリケーション開発用に、複数のソースからデータを検出、準備、移動、統合することをより容易にします。

https://aws.amazon.com/jp/glue/

  • そもそもETLとは
    Extract, Transform, Loadの略で以下のように複数のソースからデータをデータウェアハウスなどにまとめる一連プロセスのこと。最近では処理できる性能などが上がっていることもあり、
    先にLoadしてからTransformしようというELTが主流になりつつある。

抽出、変換、ロード (ETL) は、複数のソースからのデータを、データウェアハウスと呼ばれる中心的な大規模リポジトリにまとめるプロセスです。

https://aws.amazon.com/jp/what-is/etl/
https://aws.amazon.com/jp/compare/the-difference-between-etl-and-elt/

glueを用いてs3上のファイルをDB(aurora, redshift etc...)に保存することが可能, pythonなどのコードベースで記述できる spark script editorにてハードコードを利用したり、gui上で作成できる ビジュアルインターフェイスの両方での構築をサポートしています。

https://docs.aws.amazon.com/ja_jp/glue/latest/dg/edit-nodes-chapter.html

方法


glueはデフォルトではutf-8しか正常に読み取れない。なのでファイルを読み込む際にエンコードしてやる必要あり。

そんな時はspark.apacheのDataframeReaderのsparksession.read.format.optionを用いることで可能。

https://spark.apache.org/docs/latest/api/java/org/apache/spark/sql/DataFrameReader.html

対応するファイルは以下の様に制限はあるが、tsvなどもcsvをformatで指定しつつ、file_deilimterをtabに指定することで取り込めたりなど融通が効く。

                data_source = self.glue_ctx.spark_session.read.format({ファイルformat}) \
                    .option("encoding", {ファイルエンコード指定}) \
                    .load({s3ファイルパス})

以下のコードのformatを辿っていけばどのファイルformatは対応しているかがわかる。https://github.com/apache/spark/blob/master/python/pyspark/sql/readwriter.py

encodingはこちら。
BOMコード対応のエンコードなどもあり。(utf-8-sig
https://docs.python.org/3/library/codecs.html

結論


仕事で、様々なファイルフォーマットの様々なencodeのファイルを取り込める必要があったが、optionにて指定できることが多く、こちらのファイル取り込み方を用いればおおよそのファイルはそのまま取り込める。
このようなoptionで融通が効く範囲が広い取り込み方を選択するアプローチか、前処理で一律parquet or csvに変換するのが様々なファイルフォーマット、encodeのファイル取り込みのアプローチなのかと勝手に考えている。

備考


zero etlがどうやらauroraとかも対応したらしいから楽しみ

https://aws.amazon.com/jp/about-aws/whats-new/2023/11/amazon-rds-mysql-zero-etl-integration-amazon-redshift-public-preview/

参考文献


https://aws.amazon.com/jp/glue/
https://aws.amazon.com/jp/what-is/etl/
https://aws.amazon.com/jp/compare/the-difference-between-etl-and-elt/
https://docs.aws.amazon.com/ja_jp/glue/latest/dg/edit-nodes-chapter.html
https://spark.apache.org/docs/latest/api/java/org/apache/spark/sql/DataFrameReader.html
https://github.com/apache/spark/blob/master/python/pyspark/sql/readwriter.py
https://docs.python.org/3/library/codecs.html
https://aws.amazon.com/jp/about-aws/whats-new/2023/11/amazon-rds-mysql-zero-etl-integration-amazon-redshift-public-preview/

Discussion