📄
Apache BeamのFileIOで、ファイルの更新日時を取得する
概要
Beamのパイプラインで読み出したファイルの更新日時を取るコードを書いたのだが、ワークアラウンドを書かないといけなかったのでそのメモ。
更新日時を上手く取得できない例
ファイルの更新日時を取得するには、FileIO.ReadableFile
を取得し、そこからMatchResult.Metadata
を参照すれば良いが、以下のコードでは上手くいかない。
上記のコードを実行すると、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 を参照して以下のコードに変更した。
これを実行すると、以下のように、更新日時を取得することができた。
*** 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 に格納した。
Discussion