【发布时间】:2020-03-02 09:03:00
【问题描述】:
以下代码构建管道并生成 DAG。 RuntimeError: NotImplementedError [while running 'generatedPtransform-438'] 请告诉我在 python 中是否有任何直接连接 mysql 的连接器。
from apache_beam.options.pipeline_options import PipelineOptions
from google.cloud import pubsub_v1
from google.cloud import bigquery
import mysql.connector
import apache_beam as beam
import logging
import argparse
import sys
import re
PROJECT="12344"
TOPIC = "projects/12344/topics/mytopic"
class insertfn(beam.Dofn):
def insertdata(self,data):
db_conn=mysql.connector.connect(host="localhost",user="abc",passwd="root",database="new")
db_cursor=db_conn.cursor()
emp_sql = " INSERT INTO emp(ename,eid,dept) VALUES (%s,%s,%s)"
db_cusror.executemany(emp_sql,(data[0],data[1],data[2]))
db_conn.commit()
print(db_cursor.rowcount,"record inserted")
class Split(beam.DoFn):
def process(self, data):
data = data.split(",")
return [{
'ename': data[0],
'eid': data[1],
'dept': data[2]
}]
def main(argv=None):
parser = argparse.ArgumentParser()
parser.add_argument("--input_topic")
parser.add_argument("--output")
known_args = parser.parse_known_args(argv)
p = beam.Pipeline(options=PipelineOptions())
(p
| 'ReadData' >> beam.io.ReadFromPubSub(topic=TOPIC).with_output_types(bytes)
| "Decode" >> beam.Map(lambda x: x.decode('utf-8'))
| 'ParseCSV' >> beam.ParDo(Split())
| 'WriteToMySQL' >> beam.ParDo(insertfn())
)
result = p.run()
result.wait_until_finish()
【问题讨论】:
-
您收到的错误信息是什么?
-
我正在检查您的代码。由于您是 Apache Beam 编程的新手,我建议您查看这个由 Google 创建的 Python DataFlow 代码存储库,link。另一件事,您是否以与 insertfn() 相同的方式定义您的 Split() 过程?
-
您能告诉我您正在使用的 Apache Beam 版本吗?另外,你提到上面的代码运行,你的意思是你的 MySQL 是在 prem 上的吗?你能告诉我你用来运行管道的命令吗?
-
@AlexandreMoraes 我使用 apache beam 2.19.0。运行管道的命令是 python -m npipe --input_topic "projects/myprojectid1/topics/mytopic" --streaming 我不在 prem mysql 上使用,我编写了单独的 python 文件只是为了将一些随机硬编码值插入云 mysql 并且它工作,所以我怀疑问题是管道代码连接到 mysql 实例的位置。请让我知道你的想法
-
在发布问题时添加其他信息。
标签: python mysql google-cloud-platform google-cloud-dataflow apache-beam