Python 导入和使用google云包

Python 导入和使用google云包,python,python-3.x,google-cloud-dataflow,apache-beam,Python,Python 3.x,Google Cloud Dataflow,Apache Beam,我已经创建了一个管道,它会给出一个数字列表。 这些数字流入ParDo,在ParDo中,我使用一个数字查询Bigquery表,然后返回查询结果 这在本地有效。Linux、Python 3.7、google cloud bigquery 1.22.0 当我将作业上传到数据流时,事情变得有趣起来。 我在顶层所做的一切在下面的函数中都无效。因此,我必须在每个函数中导入所有使用过的包,以便可用 这太难看了,我怀疑我做错了什么。但是什么呢 所以我得到了这样一个函数: def flatten(elements

我已经创建了一个管道,它会给出一个数字列表。 这些数字流入ParDo,在ParDo中,我使用一个数字查询Bigquery表,然后返回查询结果

这在本地有效。Linux、Python 3.7、google cloud bigquery 1.22.0

当我将作业上传到数据流时,事情变得有趣起来。 我在顶层所做的一切在下面的函数中都无效。因此,我必须在每个函数中导入所有使用过的包,以便可用

这太难看了,我怀疑我做错了什么。但是什么呢

所以我得到了这样一个函数:

def flatten(elements):
    import datetime
    for element in elements['transactionids']:
        print('flatten: ' + str(element) + ' ' + datetime.datetime.now().isoformat())
        yield element
class TransformTransaction(beam.DoFn):
    def setup(self):
        print("This will never run. Why?")

    def start_bundle(self):
        print("Bundle Start")
        from google.cloud import bigquery
        self.client = bigquery.Client()
        self.dataset_id = 'mydataset'
        self.table_id = 'testhijs'
        self.table_ref = self.client.dataset(self.dataset_id).table(self.table_id)
        self.table = self.client.get_table(self.table_ref)

   def retrieveTransactionData(self, transactionID):
        query = f"select transactionID, someNr from `thijs-dev.thijsset.thijstable` " \
                f"where transactionID = {transactionID}"

    query_job = self.client.query(
        query,
        location="EU",
    )  
    print(query_job)

    transactions = []

    for row in query_job:
        transactions.append(row)

    return transactions
我得到了这样一个“DoFn类”:

def flatten(elements):
    import datetime
    for element in elements['transactionids']:
        print('flatten: ' + str(element) + ' ' + datetime.datetime.now().isoformat())
        yield element
class TransformTransaction(beam.DoFn):
    def setup(self):
        print("This will never run. Why?")

    def start_bundle(self):
        print("Bundle Start")
        from google.cloud import bigquery
        self.client = bigquery.Client()
        self.dataset_id = 'mydataset'
        self.table_id = 'testhijs'
        self.table_ref = self.client.dataset(self.dataset_id).table(self.table_id)
        self.table = self.client.get_table(self.table_ref)

   def retrieveTransactionData(self, transactionID):
        query = f"select transactionID, someNr from `thijs-dev.thijsset.thijstable` " \
                f"where transactionID = {transactionID}"

    query_job = self.client.query(
        query,
        location="EU",
    )  
    print(query_job)

    transactions = []

    for row in query_job:
        transactions.append(row)

    return transactions

使用管道配置--save_main_session。这将导致全局命名空间的状态被pickle并加载到云数据流工作程序上

Python中的完整示例:

将apache_梁导入为梁
从apache_beam.options.pipeline_options导入PipelineOptions
从apache_beam.options.pipeline_options导入设置选项
导入argparse
def运行(argv=None):
parser=argparse.ArgumentParser()
已知参数,管道参数=解析器。解析已知参数(argv)
管道参数扩展([
“--runner=DataflowRunner”,
“--project=proj”,
“--区域=区域”,
“--staging_location=gs://bucket/staging/”,
“--temp_location=gs://bucket/temp/”,
“--job_name=name”,
'--setup_file=./setup.py'
]) 
管道选项=管道选项(管道参数)
pipeline_options.view_as(SetupOptions)。save_main_session=True#这是您需要包括的内容

编辑:

Grteat资料,谢谢。要在shell脚本中使用它,我使用选项
--save_main_session
,而不使用
=true
bitOops,我将进行编辑。如果这解决了你的问题,考虑一下投票和接受它:)CelsS-较短的选项是:<代码> PultNysOpdio=管道选项(StudioNyARGS,SaveEnMeNySaleSt= TRUE)< /代码>