从 PCollection 中提取文件名并有效地解析它们
Extract file names from PCollection and parse them efficiently
我有一个 BigQuery table,其中每一行代表一个文本文件 (gs://...) 和一个行号。
file, line, meta
file1.txt, 10, meta1
file2.txt, 12, meta2
file1.txt, 198, meta3
每个文件约1.5Gb,我的桶中约有1k个文件。我的目标是提取 BQ table.
中指定的行
我决定实施以下计划:
- 地图
table
=>KV<file,line>
- 减少
KV<file,line>
=> KV<file, [lines]>
- 地图
KV<file, [lines]>
=>[KV<file, rowData>]
其中 rowData
表示来自 file
在来自 lines
.
的某行上的实际数据
如果我仔细阅读文档,TextIO.Read
不应该在这种情况下使用。作为解决方法,我可以使用 GcsIoChannelFactory
从 GCS 读取文件。这是对的吗?对于所描述的任务,它是更好的方法吗?
是的,你的做法是正确的。目前没有更好的方法从文本文件中读取带有行号的行,除了自己使用 GcsIoChannelFactory
(或编写自定义 FileBasedSource
,但这更复杂,并且在你的情况是因为事先不知道文件名)。
Splittable DoFn 这种情况和其他类似情况会变得更好 - 相关工作正在进行中,但工作量很大,因此尚无时间表。
我有一个 BigQuery table,其中每一行代表一个文本文件 (gs://...) 和一个行号。
file, line, meta
file1.txt, 10, meta1
file2.txt, 12, meta2
file1.txt, 198, meta3
每个文件约1.5Gb,我的桶中约有1k个文件。我的目标是提取 BQ table.
中指定的行我决定实施以下计划:
- 地图
table
=>KV<file,line>
- 减少
KV<file,line>
=>KV<file, [lines]>
- 地图
KV<file, [lines]>
=>[KV<file, rowData>]
其中 rowData
表示来自 file
在来自 lines
.
如果我仔细阅读文档,TextIO.Read
不应该在这种情况下使用。作为解决方法,我可以使用 GcsIoChannelFactory
从 GCS 读取文件。这是对的吗?对于所描述的任务,它是更好的方法吗?
是的,你的做法是正确的。目前没有更好的方法从文本文件中读取带有行号的行,除了自己使用 GcsIoChannelFactory
(或编写自定义 FileBasedSource
,但这更复杂,并且在你的情况是因为事先不知道文件名)。
Splittable DoFn 这种情况和其他类似情况会变得更好 - 相关工作正在进行中,但工作量很大,因此尚无时间表。