Python 在Google Cloud Dataflow/Apache Beam中创建GCS对象的PCollection

Python 在Google Cloud Dataflow/Apache Beam中创建GCS对象的PCollection,python,google-cloud-dataflow,apache-beam,Python,Google Cloud Dataflow,Apache Beam,我正在尝试通过云数据流学习我的方法。为了便于学习,我将它们的基本功能分解为一个简单的strip函数。我想创建一个属于GCS对象的文件名的PCollection。我收到消息说函数ReadFromText()不可移植 我对PCollections的理解是,它是要处理的对象的列表。我可以写一个循环,一个接一个地抛出每个要处理的对象,但这不是我想要做的。我想让这部分保持动态,让apachebeam处理其余部分。我只想给出GCS中的文件列表 到目前为止,我已经成功地处理了“单元素PCollections”

我正在尝试通过云数据流学习我的方法。为了便于学习,我将它们的基本功能分解为一个简单的strip函数。我想创建一个属于GCS对象的文件名的PCollection。我收到消息说函数
ReadFromText()
不可移植

我对PCollections的理解是,它是要处理的对象的列表。我可以写一个循环,一个接一个地抛出每个要处理的对象,但这不是我想要做的。我想让这部分保持动态,让apachebeam处理其余部分。我只想给出GCS中的文件列表

到目前为止,我已经成功地处理了“单元素PCollections”。我也不想做类似于
'gs://dataflow samples/shakespeare/*'
的事情

我还看了和。他们还说这个函数是不可移植的。请导游

以下是我迄今为止所做的工作:

"""A word-counting workflow."""

from __future__ import absolute_import

import argparse
import logging
import re

from past.builtins import unicode

import apache_beam as beam
from apache_beam.io import ReadFromText, ReadAllFromText
from apache_beam.io import WriteToText
from apache_beam.metrics import Metrics
from apache_beam.metrics.metric import MetricsFilter
from apache_beam.options.pipeline_options import PipelineOptions
from apache_beam.options.pipeline_options import SetupOptions
from apache_beam.io.gcp import gcsio


class WordExtractingDoFn(beam.DoFn):
  """Parse each line of input text into words."""

  def __init__(self):
    super(WordExtractingDoFn, self).__init__()
  def process(self, element):  
    text_line = element.strip()
    return text_line


def run(argv=None):
  """Main entry point; defines and runs the wordcount pipeline."""

  p = beam.Pipeline(options=PipelineOptions())

  # Read the text file[pattern] into a PCollection.
  elements =                ['gs://dataflow-samples/shakespeare/1kinghenryiv.txt',
                            'gs://dataflow-samples/shakespeare/1kinghenryvi.txt',
                            'gs://dataflow-samples/shakespeare/2kinghenryiv.txt',
                            'gs://dataflow-samples/shakespeare/2kinghenryvi.txt',
                            'gs://dataflow-samples/shakespeare/3kinghenryvi.txt',
                            'gs://dataflow-samples/shakespeare/allswellthatendswell.txt',
                            'gs://dataflow-samples/shakespeare/antonyandcleopatra.txt',
                            'gs://dataflow-samples/shakespeare/asyoulikeit.txt',
                            'gs://dataflow-samples/shakespeare/comedyoferrors.txt',
                            'gs://dataflow-samples/shakespeare/coriolanus.txt',
                            'gs://dataflow-samples/shakespeare/cymbeline.txt',
                            'gs://dataflow-samples/shakespeare/hamlet.txt',
                            'gs://dataflow-samples/shakespeare/juliuscaesar.txt',
                            'gs://dataflow-samples/shakespeare/kinghenryv.txt',
                            'gs://dataflow-samples/shakespeare/kinghenryviii.txt',
                            'gs://dataflow-samples/shakespeare/kingjohn.txt',
                            'gs://dataflow-samples/shakespeare/kinglear.txt',
                            'gs://dataflow-samples/shakespeare/kingrichardii.txt',
                            'gs://dataflow-samples/shakespeare/kingrichardiii.txt',
                            'gs://dataflow-samples/shakespeare/loverscomplaint.txt',
                            'gs://dataflow-samples/shakespeare/loveslabourslost.txt',
                            'gs://dataflow-samples/shakespeare/macbeth.txt',
                            'gs://dataflow-samples/shakespeare/measureforemeasure.txt',
                            'gs://dataflow-samples/shakespeare/merchantofvenice.txt',
                            'gs://dataflow-samples/shakespeare/merrywivesofwindsor.txt',
                            'gs://dataflow-samples/shakespeare/midsummersnightsdream.txt',
                            'gs://dataflow-samples/shakespeare/muchadoaboutnothing.txt',
                            'gs://dataflow-samples/shakespeare/othello.txt',
                            'gs://dataflow-samples/shakespeare/periclesprinceoftyre.txt',
                            'gs://dataflow-samples/shakespeare/rapeoflucrece.txt',
                            'gs://dataflow-samples/shakespeare/romeoandjuliet.txt',
                            'gs://dataflow-samples/shakespeare/sonnets.txt',
                            'gs://dataflow-samples/shakespeare/tamingoftheshrew.txt',
                            'gs://dataflow-samples/shakespeare/tempest.txt',
                            'gs://dataflow-samples/shakespeare/timonofathens.txt',
                            'gs://dataflow-samples/shakespeare/titusandronicus.txt',
                            'gs://dataflow-samples/shakespeare/troilusandcressida.txt',
                            'gs://dataflow-samples/shakespeare/twelfthnight.txt',
                            'gs://dataflow-samples/shakespeare/twogentlemenofverona.txt',
                            'gs://dataflow-samples/shakespeare/various.txt',
                            'gs://dataflow-samples/shakespeare/venusandadonis.txt',
                            'gs://dataflow-samples/shakespeare/winterstale.txt']

  books = p | beam.Create((elements))
  #print (books)

  lines = p | 'read' >> ReadFromText(books)

  counts = (lines
            | 'split' >> (beam.ParDo(WordExtractingDoFn())
                          .with_output_types(unicode)))

  output = counts | 'write' >> WriteToText('gs://ihopeitworks/Users/see.txt',shard_name_template='')

  result = p.run()
  result.wait_until_finish()


if __name__ == '__main__':
  logging.getLogger().setLevel(logging.INFO)
  run()

你很接近。尝试以下方法,即使用ReadAllFromText通过管道从books PCollection读取,而不是将books作为ReadFromText的参数传递。希望有帮助

books = p | beam.Create((elements))
lines = books | 'read' >> ReadAllFromText()

我的理解是,PCollection不是一个iterable。让我们想想这意味着什么。虽然PCollection确实是一个项目的集合,因此人们可能会直觉地认为,在任何时候,我都可以询问它的大小并对其进行迭代。。。事实上,PCollection是一个逻辑集合,在任何给定的时间实际上不包含任何项。如果要在PCollection上迭代,请执行一个ParDo,该ParDo对最终看到的集合的每个成员执行一个函数。换句话说,如果要创建一个接受bucket名称并在其对象上运行某些函数的对象,我必须编写一个ParDo?我应该怎么做才能在上面的代码中ReadFromText接受文件名而不是字符串?我想我可以写一个像这样的lamdba函数[.我没有听懂这个故事,这可能是我的错。你可以用概念性的术语来描述你面临的难题,而不是具体的实现吗?我感觉你想从文件名输入列表的内容中创建一个PCollection?是的。没错。还有做一个
ReadFromText()
在该PCollection上。谢谢!我尝试使用ReadAllFromText(),它为我提供了这些文本文件中的所有内容。我尝试ReadFromText()的原因是,这样我就可以读取包含要操作的对象名称的文件,然后执行ParDo()在这些对象上。基本上从从文件读取的列表创建一个PCollection。很高兴知道Pranay对您有效。基本上,您不能将文件名的PCollection作为ReadAllFromText或ReadFromText的参数传递。您必须按照我在示例中所示的方式进行管道传输。如果您愿意,请接受答案是的。