运行光束管道时,“ PBegin”对象没有属性“ windowing”

时间:2019-11-05 03:07:45

标签: python-3.x google-cloud-dataflow apache-beam apache-beam-io

在运行数据流作业时,我得到“ PBegin”对象没有“ windowing”属性。 我在pardo函数中调用connectclass类。

我正在尝试从Beam python SDK连接NOSQL数据库并运行sql以从表中提取数据。然后使用另一个pardo将输出写入单独的文件中。

class Connector(beam.DoFn):
    def __init__(self,username,seeds,keyspace,password,datacenter=None):
    self.username = username
    self.password = password
    self.seeds = seeds
    self.keyspace = keyspace
    self.datacenter = datacenter
    super(self.__class__, self).__init__()

    def process(self, element):

    if datacenter:
        load_balancing_policy = DCAwareRoundRobinPolicy(local_dc=self.datacenter)
    auth_provider = PlainTextAuthProvider(username=self.username, password=self.password)
    cluster = Cluster(contact_points=self.seeds,
                      load_balancing_policy=load_balancing_policy,
                      auth_provider=auth_provider)
    session=cluster.connect(self.seeds,self.keyspace,self.username, self.password, self.datacenter)
    rows = session.execute(SQL Query)
    yield rows

2 个答案:

答案 0 :(得分:2)

偶然发现了同一问题。试图连接到RDBMS源,但是我想在实现设计方面,NoSQL和SQL数据库之间没有区别。

除了Jayadeep Jayaraman建议的以外,可以通过使用ParDo来实现此目的。实际上,如果这样做的限制在您的用例中可以接受,则使用beam documentation建议进行连接:

对于有界(批处理)源,当前有两个用于创建Beam源的选项:

使用ParDo和GroupByKey。

使用Source接口并扩展BoundedSource抽象子类。

ParDo是推荐的选项,因为实现Source可能很棘手。有关可能需要使用Source>>(例如动态工作平衡)的一些用例的列表,请参见何时使用> Source界面。

您没有显示如何使用DoFn。对我来说,记住DoFn对已经存在的PCollection的元素起作用是有帮助的。它本身无法从头开始创建DoFn。因此,要解决您提到的问题,您可能希望从内存中创建一个PCollection,其中包含一个查询元素,用于从源中检索数据。然后将从源中读取的ParDo应用于此PCollection。

BTW:我想从我的Pcollection中的RDBMS中读取每个分区一个元素-这样就可以从SQL数据库中并行读取数据。

解决方案可能如下所示:

p | beam.Create(["Your Query / source object qualifier goes here"]) 
  | "Read from Database" >> beam.ParDo(YourConnector())

让我也提及使用DoFn的start_bundle和finish_bundle方法来建立/断开连接是一个好主意

答案 1 :(得分:1)

您需要为此使用Beam IO。此处[1]提供了有关如何在Python中构建自定义IO的指南。

ParDo通常用于在PCollection上运行转换。您也可以查看SplittableDoFn来构建类似的东西。在这里参考[2]

1-https://beam.apache.org/documentation/io/developing-io-python/

2-{{​​3}}