Flink流-使用StreamingFileSink时更改零件文件名吗?

时间:2019-05-20 16:24:49

标签: java apache apache-flink avro parquet

我正在尝试使用Flink流传输来消耗Kafka主题消息并创建(定期)镶木地板文件,该文件将保存在s3上。
当使用批量格式的流文件接收器来更改创建的零件文件名(或添加后缀/前缀)使其比part-0-0或part-1-3更具唯一性时,是否有办法?

StreamingFileSink<> sink = StreamingFileSink.forBulkFormat(new Path("s3://test-bucket/"),               ParquetAvroFactory.getParquetWriter(schema,  CompressionCodec.UNCOMPRESSED.name()))
.withBucketAssigner(new PartitionBucketAssigner(partitionColumns))
.build();

1 个答案:

答案 0 :(得分:0)

您可以在BucketAssigner上覆盖getBucketId方法(请参见https://ci.apache.org/projects/flink/flink-docs-master/api/java/org/apache/flink/streaming/api/functions/sink/filesystem/BucketAssigner.html),这将影响路径,但显然不会影响零件文件名(请参见下面的注释)。

零件文件名在SELECT IF( EXISTS(SELECT name FROM users WHERE name='${data.name}'), (SELECT password FROM users WHERE name='${data.name}') , NULL) 的这段代码中建立:

org.apache.flink.streaming.api.functions.sink.filesystem.Bucket

似乎并非旨在进行自定义。