Google cloud dataflow Apache Beam TextIO。使用行号读取

Google cloud dataflow Apache Beam TextIO。使用行号读取,google-cloud-dataflow,apache-beam,Google Cloud Dataflow,Apache Beam,从TextIO.read读取到PCollection中的行是否可以访问行号?对于这里的上下文,我正在处理一个CSV文件,需要访问给定行的行号 如果无法通过TextIO.Read进行读取,则似乎可以使用某种自定义读取或转换,但我很难确定从何处开始。您可以使用手动读取文件,从中读取时可以确定行号 一个简单的解决方案如下所示: p .apply(FileIO.match().filepattern(“/file.csv”)) .apply(FileIO.readMatches()) .应用(FlatM

从TextIO.read读取到PCollection中的行是否可以访问行号?对于这里的上下文,我正在处理一个CSV文件,需要访问给定行的行号

如果无法通过TextIO.Read进行读取,则似乎可以使用某种自定义读取或转换,但我很难确定从何处开始。

您可以使用手动读取文件,从中读取时可以确定行号

一个简单的解决方案如下所示:

p
.apply(FileIO.match().filepattern(“/file.csv”))
.apply(FileIO.readMatches())
.应用(FlatMapElements)
.into(字符串())
.via((FileIO.ReadableFile f)->{
列表结果=新建ArrayList();
try(BufferedReader br=newbufferedreader(Channels.newReader(f.open(),“UTF-8”)){
int lineNr=1;
String line=br.readLine();
while(行!=null){
结果.添加(lineNr+“,”+行);
line=br.readLine();
lineNr++;
}
}捕获(IOE异常){
抛出新的RuntimeException(“读取时出错”,e);
}
返回结果;
}));

上面的解决方案只是将行号预先添加到每个输入行

您可能需要从textIO继承并添加自定义逻辑以输出元组。或者,在CSV文件的每一行中添加这一行号作为一个额外的列(我的意思是修改输入文件的内容);然后您可以使用原始的textIO和后续的DoFn来提取行号。有关于如何从textIO继承的指针吗?没有看到我可以获取行号的地方。所以我想你不能通过添加一个额外的列来修改你的输入数据?然后,我想您必须从filebasedsource.filebasedsource(python:)开始。实现您自己的read_records()方法,该方法返回一个迭代器,该迭代器给出2元组(行,行号)。对于您引入的新的
源类
,您可以将
splittable
=设为False,这样逻辑就容易多了(至少从一开始)。