使用TextIO.read获取各行的PCollection<String>
后,是否可以将某种组合变换用于批量(例如25组)?因此返回类型最终会看起来像:PCollection<String, List<String>>
。看起来应该可以使用某种CombineFn
,但API对我来说仍然有点神秘。
这里的上下文是我正在读取CSV文件(可能非常大),解析+处理行并将它们转换为JSON,然后调用REST API ......但我不想要单独命中每一行的REST API,因为REST API一次支持多个项目(最多1000个,因此不是整个批次)。
答案 0 :(得分:1)
我猜你可以像下面那样做一些简单的批处理(使用stateful API)。要在BatchingFn
中维护的状态是行的当前缓冲区或self._lines
。对不起,我在python
(不熟悉Java API)
from apache_beam.transforms import DoFn
from apache_beam.transforms import ParDo
MY_BATCH_SIZE = 512
class BatchingFn(DoFn):
def __init__(self, batch_size=100):
self._batch_size = batch_size
def start_bundle(self):
# buffer for string of lines
self._lines = []
def process(self, element):
# Input element is a string (representing a CSV line)
self._lines.append(element)
if len(_lines) >= self._batch_size:
self._flush_batch()
def finish_bundle(self):
# takes care of the unflushed buffer before finishing
if self._lines:
self._flush_batch()
def _flush_batch(self):
#### Do your REST API call here with self._lines
# .....
# Clear the buffer.
self._lines = []
# pcoll is your PCollection of lines.
(pcoll | 'Call Rest API with batch data' >> ParDo(BatchingFn(MY_BATCH_SIZE)))
关于使用数据驱动的触发器,您可以参考Batch PCollection in Beam/Dataflow。