📄

Apache BeamのFileIOで、ファイルの更新日時を取得する

2022/11/25に公開

概要

Beamのパイプラインで読み出したファイルの更新日時を取るコードを書いたのだが、ワークアラウンドを書かないといけなかったのでそのメモ。

更新日時を上手く取得できない例

ファイルの更新日時を取得するには、FileIO.ReadableFileを取得し、そこからMatchResult.Metadataを参照すれば良いが、以下のコードでは上手くいかない。

https://github.com/kn1kn1/beam-examples/blob/6de696825fda1669ab80b0d757a2c75c0e8532dc/readable-file/src/main/java/org/example/ReadableFileExampleNG.java#L20-L43

上記のコードを実行すると、lastModifiedMillis: 0, lastModified: 1970-01-01T00:00:00.000Zとなってしまっていた。

*** name: kinglear.txt
*** lastModifiedMillis: 0
*** lastModified: 1970-01-01T00:00:00.000Z
*** sizeBytes: 157283

対応方法

https://stackoverflow.com/questions/66845945/how-to-override-default-metadata-lastmodifiedmillis-of-apache-beams-fileio-wi/71669379#71669379 を参照して以下のコードに変更した。

https://github.com/kn1kn1/beam-examples/blob/6de696825fda1669ab80b0d757a2c75c0e8532dc/readable-file/src/main/java/org/example/ReadableFileExample.java#L22-L52

これを実行すると、以下のように、更新日時を取得することができた。

*** name: kinglear.txt
*** lastModifiedMillis: 1472084114722
*** lastModified: 2016-08-25T00:15:14.722Z
*** sizeBytes: 157283

上記を動作させるには、Beam側での対応が必要であり、https://github.com/apache/beam/pull/15510 で対応が取り込まれている。

https://github.com/apache/beam/pull/15510 のマージはOct 7, 2021ということなので、Oct 13, 2021にリリースされたBeam 2.33.0以降が必要である。

まとめ

ファイルの更新日時を正しく取得するには以下が必要である。

  • Beam 2.33.0以降のBeam
  • 以下のワークアラウンドコード
MetadataCoderV2 metadataCoder = MetadataCoderV2.of();
p.getCoderRegistry().registerCoderForClass(MatchResult.Metadata.class, metadataCoder);
p.getCoderRegistry().registerCoderForClass(FileIO.ReadableFile.class, ReadableFileCoder.of(metadataCoder));

上記コードは、https://github.com/kn1kn1/beam-examples/tree/master/readable-file に格納した。

GitHubで編集を提案

Discussion