/home/by-natures/dev*

データ界隈で働くエンジニアとしての技術的なメモと、たまに普通の日記。

2019/02/06 DynamicFrame の出力スキーマを parquet-tools で確認

AWS Glue で書いた Parquet ファイルが Glue のデータカタログのスキーマと異なることが度々発生しているので、直接 Parquet ファイルのスキーマを確認できないか調べたところ、parquet-tools コマンドで確認できることがわかりました。

github.com

mvn install コマンドでインストールしたり、Maven リポジトリから jar をダウンロードして実行するなど色々方法はありますが、Mac OS 環境だと brew install できます。README には

cd parquet-tools && mvn clean package -Plocal 

でインストールするとありますが、Parquet の他のサブモジュールの成果物も必要なので、 git clone したあとに親モジュール内で mvn clean package -Plocal したほうが良さそう。そのあとも thrift コマンドがないとエラーが出たりしたので brew でインストールしましたが、Parquet が必要なバージョンと合わなかったりしたのでひとまず断念。

Maven リポジトリから jar をダウンロードできるので、少し使うだけならこれが一番よいなと思っていたのですが、エラーも吐かずにエラーコード1を返してきます。Fat jar のようなので java -jar で叩くだけだと思うんですが、、

最後に brew で入れてみると:

$ brew install parquet-tools

特にエラーもなく簡単にインストールできました。インストール後は parquet-tools コマンドとして利用できます:

$ parquet-tools schema file.snappy.parquet
message spark_schema {
  optional binary title (UTF8);
  optional binary word (UTF8);
  optional int64 num;
}

余談: Athena はある程度スキーマ差を吸収している?

例えば上のスキーマに対して Glue Catalog で numint として定義していると、 intbigint(int64) で型が異なるので、Redshift から読むとエラーになります。ただ Athena で同じようなクエリを投げてもエラーにはなりません。

structmap, struct に対して string のようなスキーマ差は Athena もエラーとなるのですが、ビット長が違う程度のスキーマ差は Athena は吸収してくれるようです。そのため、最終的に利用する方法が Redshift なのであれば、Athena ではなく Redshift でデータが読めるか確認しないといけません。