Google cloud dataflow apachebeam管道中的组元素

Google cloud dataflow apachebeam管道中的组元素,google-cloud-dataflow,apache-beam,apache-beam-io,Google Cloud Dataflow,Apache Beam,Apache Beam Io,我有一个管道可以解析AVRO文件中的记录 我需要将传入的记录拆分为500个条目,以便调用一个同时接受多个输入的API 有没有办法用Python SDK做到这一点?我假设您指的是批处理用例。对此,您有几个选项: 如果您的PCollection足够大,并且您对bundle的大小有一定的灵活性,则可以在按随机/循环顺序为元素分配键后使用GroupByKey转换。e、 g: my_collection = p | ReadRecordsFromAvro() element_bundles = (my_

我有一个管道可以解析AVRO文件中的记录

我需要将传入的记录拆分为500个条目,以便调用一个同时接受多个输入的API


有没有办法用Python SDK做到这一点?

我假设您指的是批处理用例。对此,您有几个选项:

如果您的PCollection足够大,并且您对bundle的大小有一定的灵活性,则可以在按随机/循环顺序为元素分配键后使用
GroupByKey
转换。e、 g:

my_collection = p | ReadRecordsFromAvro()

element_bundles = (my_collection 
                     # Choose a number of keys that works for you (I chose 50 here)
                   | 'AddKeys' >> beam.Map(lambda x: (randint(0, 50), x))
                   | 'MakeBundles' >> beam.GroupByKey()
                   | 'DropKeys' >> beam.Map(lambda (k, bundle): bundle)
                   | beam.ParDo(ProcessBundlesDoFn()))
其中
ProcessBundlesDoFn
是这样的:

class ProcessBundlesDoFn(beam.DoFn):
  def process(self, bundle):
    while bundle.has_next():
      # Fetch in batches of 500 until you're done
      result = fetch_n_elements(bundle, 500)
      yield result

如果需要拥有正好500个元素的所有捆绑包,则可能需要:

  • 计算PCollection中元素的#
  • 将该计数作为单例输入传递给您的
    'AddKeys'
    ParDo,以准确确定您需要的键数

  • 希望这能有所帮助。

    谢谢巴勃罗,我最后就是这么做的。不幸的是,我希望尽可能多地将其并行化,并且我可以分配负载的“bucket”或随机键的数量很难预先计算。将端输入作为单例传递的文档非常稀少。谢谢另外,请注意,您选择的键的数量将决定管道中的并行性,因为每个键都是串行处理的。例如,使用50个键,您的作业将无法在50台以上的机器上运行(实际上,最终的工人数量远小于键的数量)。此外,如果您需要,我将详细介绍侧面输入方法。谢谢Pablo!我已经设法在DAG构建时预先计算了项目的数量。