我有一个Java Iterable对象,即Iterable记录。我想将其传递给Beam管道。我尝试过
PCollection csvRecordPC = p.apply(“创建收藏集”,Create.of(记录));
它导致了错误
执行Java类时发生异常。无法为没有元素的“创建” PTransform确定默认编码器。添加元素,在PTransform上调用Create.empty(Coder),Create.empty(TypeDescriptor),或调用'withCoder(Coder)'或'withType(TypeDescriptor)'。
我应该使用哪个编码器?或者如何编写自定义编码器?
答案 0 :(得分:0)
我找到了使用FileIO的解决方案。
p.apply(FileIO.match().filepattern(options.getInputFile()))
.apply(FileIO.readMatches())
.apply(ParDo.of(new CsvParser()))
CsvPaser()是
public class CsvParser extends DoFn<ReadableFile, CSVRecord> {
@DoFn.ProcessElement
public void processElement(@Element ReadableFile element, DoFn.OutputReceiver<CSVRecord> receiver) throws IOException {
InputStream is = Channels.newInputStream(element.open());
Reader reader = new InputStreamReader(is);
Iterable<CSVRecord> records = CSVFormat.EXCEL.withFirstRecordAsHeader().parse(reader);
for (CSVRecord record : records) {
receiver.output(record);
}
}
}