如何在Apache Beam中读取CSVRecord?

时间:2019-02-24 23:31:47

标签: csv apache-beam apache-commons-csv

我有一个Java Iterable对象,即Iterable记录。我想将其传递给Beam管道。我尝试过

PCollection csvRecordPC = p.apply(“创建收藏集”,Create.of(记录));

它导致了错误

执行Java类时发生异常。无法为没有元素的“创建” PTransform确定默认编码器。添加元素,在PTransform上调用Create.empty(Coder),Create.empty(TypeDescriptor),或调用'withCoder(Coder)'或'withType(TypeDescriptor)'。

我应该使用哪个编码器?或者如何编写自定义编码器?

1 个答案:

答案 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);
        }
    }
}