2016-11-07 73 views
0

我有一个BigQuery表,其中每行代表一个文本文件(gs:// ...)和一个行号。从PCollection中提取文件名并有效地解析它们

file, line, meta 
file1.txt, 10, meta1 
file2.txt, 12, meta2 
file1.txt, 198, meta3 

每个文件大约1.5Gb,我的存储桶中有大约1k个文件。我的目标是在BQ表中指定提取行。

我决定执行以下方案:

  1. 地图table =>KV<file,line>
  2. 减少KV<file,line> =>KV<file, [lines]>
  3. 地图KV<file, [lines]> =>[KV<file, rowData>]

其中rowData意味着实际的数据从一些filelines行。

如果我仔细阅读文档和SO,TextIO.Read不应该在这种情况下使用。作为解决方法,我可以使用GcsIoChannelFactory从GCS读取文件。这是对的吗?对于所描述的任务而言,这是一种可取的方法吗

回答

0

是的,你的方法是正确的。目前没有更好的方法来读取文本文件中行号的行,除非您自己使用GcsIoChannelFactory(或编写自定义FileBasedSource,但这会更复杂,并且在您的情况下不起作用,因为文件名是未知的提前)。

对于Splittable DoFn这个和其他类似的场景将会更好 - 正在进行这项工作,但这是一项大量的工作,所以没有时间表。

相关问题