Apache Beam TextIO.read然后组合成批

时间:2018-05-29 12:57:27

标签: google-cloud-dataflow apache-beam

使用TextIO.read获取各行的PCollection<String>后,是否可以将某种组合变换用于批量(例如25组)?因此返回类型最终会看起来像:PCollection<String, List<String>>。看起来应该可以使用某种CombineFn,但API对我来说仍然有点神秘。

这里的上下文是我正在读取CSV文件(可能非常大),解析+处理行并将它们转换为JSON,然后调用REST API ......但我不想要单独命中每一行的REST API,因为REST API一次支持多个项目(最多1000个,因此不是整个批次)。

1 个答案:

答案 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