/home/by-natures/dev*

ソフトウェア開発者としての技術的なメモと、たまに普通の日記。

2019/02/01 Parquet ファイルと Glue DataCatalog のスキーマ差異の問題など

AWS Glue と戯れる日々なのですが、SparkSQL の扱い方がわかったところでまたいくつか問題が。

Parquet とテーブルスキーマのフォーマット差異

S3 に書き出したファイルを Glue の DataCatalog を経由して Athena や Redshift から読み込もうとすると、Athena からは読み込めるけれど Redshift からは読み込めない問題が。

https://forums.aws.amazon.com/thread.jspa?threadID=257680

Parquet のスキーマと DataCatalog で定義したテーブルスキーマとの間で整合性が取れない場合に、こういったエラーがでるのですが、今回はAthena からは読み込めるけれど Redshift からは読み込めないという中途半端な状態でした。テーブル定義では bigint を指定していたのですが、Parquet で書き出すときに int 型になっていて、その差異を Athena は吸収してくれたのですが Redshift では型が違うということでエラーになっていたのが原因でした。

Glue で書き出すと、テーブルへの INSERT ではなく Parquet ファイルの書き出しとなるので、今回のように型を間違うことは頻発しそうです。SparkSQL を一段下げて

SELECT
  CAST(col1 AS int) col1,
  CAST(col1 AS bigint) col2
FROM ...

のように、明治的にキャストしてあげると間違いも減りそうです。

空テーブルを DynamicFrame にできない

Glue の DataCatalog からデータを読み込み、DynamicFrame にするところで、対象のテーブルやパーティションが空だと Unable to infer schema for Parquet. It must be specified manually. というエラーが発生してしまう問題にも出くわしました。

stackoverflow.com

空テーブルをわざわざ DynamicFrame にする必要はないのですが、読み込むテーブルなどをパラメタ化したいと思っていて調査していましたが、テーブルのデータを読み込むところでエラーになってしまいます。これは回避方法がなさそうなので、 isEmpty メソッドなので例外を明示的に処理するなどしか対処法はなさそうです。