Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/332.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python apachebeam到BigQuery_Python_Google Cloud Platform_Google Bigquery_Google Cloud Dataflow_Apache Beam - Fatal编程技术网

Python apachebeam到BigQuery

Python apachebeam到BigQuery,python,google-cloud-platform,google-bigquery,google-cloud-dataflow,apache-beam,Python,Google Cloud Platform,Google Bigquery,Google Cloud Dataflow,Apache Beam,我正在谷歌云数据流中构建一个流程,该流程将在发布/订阅中使用消息,并基于一个键的值将消息写入BQ或GCS。我可以拆分消息,但我不确定如何将数据写入BigQuery。我尝试过使用beam.io.gcp.bigquery.WriteToBigQuery,但没有成功 我的完整代码如下: 基本上,我的问题是,我不知道如何在WriteBatchesToBQ(第73行)中指定变量元素应该写入BQ 我还尝试直接在管道中使用beam.io.gcp.bigquery.WriteToBigQuery(第128行),

我正在谷歌云数据流中构建一个流程,该流程将在发布/订阅中使用消息,并基于一个键的值将消息写入BQ或GCS。我可以拆分消息,但我不确定如何将数据写入BigQuery。我尝试过使用
beam.io.gcp.bigquery.WriteToBigQuery
,但没有成功

我的完整代码如下:

基本上,我的问题是,我不知道如何在
WriteBatchesToBQ
(第73行)中指定变量
元素
应该写入BQ

我还尝试直接在管道中使用
beam.io.gcp.bigquery.WriteToBigQuery
(第128行),但随后出现了一个错误
AttributeError:“list”对象没有属性“items”[运行“Write to BQ/”StreamToBigQuery/StreamInsertRows/ParDo(BigQueryWriteFn)]
。这可能是因为我没有给它提供字典,而是一个字典列表(我想使用1分钟的窗口)


有什么想法吗?(另外,如果代码中有太愚蠢的地方,请告诉我-我只是在玩apache beam一段时间,可能忽略了一些明显的问题)。

WriteToBigQuery示例格式如下所示:-

    project_id = "proj1"
    dataset_id = 'dataset1'
    table_id = 'table1'
    table_schema = ('id:STRING, reqid:STRING')

        | 'Write-CH' >> beam.io.WriteToBigQuery(
                                                    table=table_id,
                                                    dataset=dataset_id,
                                                    project=project_id,
                                                    schema=table_schema,
                                                    create_disposition=beam.io.BigQueryDisposition.CREATE_IF_NEEDED,
                                                    write_disposition=beam.io.BigQueryDisposition.WRITE_APPEND
                                                    ))

您可以参考这篇文章,它将让您简要了解beam数据管道。

WriteToBigQuery示例格式如下:-

    project_id = "proj1"
    dataset_id = 'dataset1'
    table_id = 'table1'
    table_schema = ('id:STRING, reqid:STRING')

        | 'Write-CH' >> beam.io.WriteToBigQuery(
                                                    table=table_id,
                                                    dataset=dataset_id,
                                                    project=project_id,
                                                    schema=table_schema,
                                                    create_disposition=beam.io.BigQueryDisposition.CREATE_IF_NEEDED,
                                                    write_disposition=beam.io.BigQueryDisposition.WRITE_APPEND
                                                    ))

您可以参考这篇文章,它将让您简要了解beam数据管道。

第二种方法是解决此问题的方法,您需要在管道中直接使用WriteToBigQuery函数。但是,需要包括beam.FlatMap步骤,以便WriteToBigQuery能够正确处理字典列表

因此,完整的管道拆分数据、按时间分组并写入BQ的定义如下:

 accepted_messages = tagged_lines_result[Split.OUTPUT_TAG_BQ] | "Window into BQ" >> GroupWindowsIntoBatches(
            window_size) | "FlatMap" >> beam.FlatMap(
            lambda elements: elements) | "Write to BQ" >> beam.io.gcp.bigquery.WriteToBigQuery(table=output_table_bq,
                                                                                               schema=(
                                                                                                   output_table_bq_schema),
                                                                                               write_disposition=beam.io.BigQueryDisposition.WRITE_APPEND,
                                                                                               create_disposition=beam.io.BigQueryDisposition.CREATE_IF_NEEDED)

完整的工作代码如下:

第二种方法是解决此问题的方法,您需要直接在管道中使用WriteToBigQuery函数。但是,需要包括beam.FlatMap步骤,以便WriteToBigQuery能够正确处理字典列表

因此,完整的管道拆分数据、按时间分组并写入BQ的定义如下:

 accepted_messages = tagged_lines_result[Split.OUTPUT_TAG_BQ] | "Window into BQ" >> GroupWindowsIntoBatches(
            window_size) | "FlatMap" >> beam.FlatMap(
            lambda elements: elements) | "Write to BQ" >> beam.io.gcp.bigquery.WriteToBigQuery(table=output_table_bq,
                                                                                               schema=(
                                                                                                   output_table_bq_schema),
                                                                                               write_disposition=beam.io.BigQueryDisposition.WRITE_APPEND,
                                                                                               create_disposition=beam.io.BigQueryDisposition.CREATE_IF_NEEDED)

完整的工作代码如下:

Hi Vibhor,很遗憾,这没有帮助。我已经更新了第127行(如下所示),但我得到的是
AttributeError:“list”对象没有属性“items”[当运行“Write to BQ/_StreamToBigQuery/StreamInsertRows/ParDo(BigQueryWriteFn)”时]
,如问题中所述(可能是因为GroupWindowsIntoBatches生成了一个字典列表而不是字典)。通常在接近beam.io.WriteToBigQuery之前,数据应该在管道中进行分析。尝试引用我在帖子中分享的示例代码。在ParDo或管道中分割记录,然后开始写入数据。我在这里的第118行得到了它。我之所以使用它,是因为我需要将管道分成两个流(一个到BQ,另一个到GCS)。我正在获取列表,因为我正在使用窗口函数。是否可以以某种方式将字典列表提供给WriteToBigQuery?是的,可以将列表加载到BigQuery,但这取决于您希望如何加载。若要将完整数据作为列表加载,则将列表映射到元素上,并将数据加载到单个字符串字段。如果您想在每个coll中单独拆分列表的每个元素,那么可以使用ParDo或管道进行拆分,并将每个元素映射到BigQuery的各个字段。我有一个字典列表,所有字典都有与目标表中的列名相对应的键。一个字典表示目标表中的一行。你能给我一些建议,在我目前所拥有的情况下,最好使用什么功能吗?嗨,Vibhor,不幸的是,这没有帮助。我已经更新了第127行(如下所示),但我得到的是
AttributeError:“list”对象没有属性“items”[当运行“Write to BQ/_StreamToBigQuery/StreamInsertRows/ParDo(BigQueryWriteFn)”时]
,如问题中所述(可能是因为GroupWindowsIntoBatches生成了一个字典列表而不是字典)。通常在接近beam.io.WriteToBigQuery之前,数据应该在管道中进行分析。尝试引用我在帖子中分享的示例代码。在ParDo或管道中分割记录,然后开始写入数据。我在这里的第118行得到了它。我之所以使用它,是因为我需要将管道分成两个流(一个到BQ,另一个到GCS)。我正在获取列表,因为我正在使用窗口函数。是否可以以某种方式将字典列表提供给WriteToBigQuery?是的,可以将列表加载到BigQuery,但这取决于您希望如何加载。若要将完整数据作为列表加载,则将列表映射到元素上,并将数据加载到单个字符串字段。如果您想在每个coll中单独拆分列表的每个元素,那么可以使用ParDo或管道进行拆分,并将每个元素映射到BigQuery的各个字段。我有一个字典列表,所有字典都有与目标表中的列名相对应的键。一个字典表示目标表中的一行。你能给我一些建议,在我目前拥有的情况下,最好使用什么功能?