Мы используем Apache Beam для обработки потоковых данных из источника pubsub в приемник GCS с динамическими именами файлов. Мы можем писать текстовые файлы, но не файлы WAV.
Мы можем записать нашу строку байтового массива (линейное 16 wav-кодирование), работающую с StringUtf8Coder, но с ошибкой компиляции с ByteArrayEncoder
// ЭТО РАБОТАЕТ:
pipelineBeginStage
.apply(
FileIO.<String, KamiAppData>writeDynamic()
.by((SerializableFunction<KamiAppData, String>) input -> input.GCSurl)
.via(
Contextful.fn((SerializableFunction<KamiAppData, String>) input -> input.audioStream),
TextIO.sink())
.to(outputBucket)
.withNaming(url -> FileNaming.getNaming(url, "wav"))
.withDestinationCoder(StringUtf8Coder.of())
.withNumShards(1));
// ЭТО ВЫХОДИТ ОШИБКА СОСТАВЛЕНИЯ:
pipelineBeginStage
.apply(
FileIO.<String, KamiAppData>writeDynamic()
.by((SerializableFunction<KamiAppData, String>) input -> input.GCSurl)
.via(
Contextful.fn((SerializableFunction<KamiAppData, byte[]>) input -> input.audioStream.getBytes()),
TextIO.sink())
.to(outputBucket)
.withNaming(url -> FileNaming.getNaming(url, "wav"))
.withDestinationCoder(ByteArrayCoder.of())
.withNumShards(1));
Ошибка, которую мы получаем:
cannot resolve method 'via(org.apache.beam.sdk.transforms.Contextful.Fn<InputT,OutputT>>,org.apache.beam.sdk.TextIO.Sink)'
Как мы можем скомпилировать и записать аудио в файл, используя API Apache Beam?