Python apachebeam到BigQuery
我正在谷歌云数据流中构建一个流程,该流程将在发布/订阅中使用消息,并基于一个键的值将消息写入BQ或GCS。我可以拆分消息,但我不确定如何将数据写入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行),
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的各个字段。我有一个字典列表,所有字典都有与目标表中的列名相对应的键。一个字典表示目标表中的一行。你能给我一些建议,在我目前拥有的情况下,最好使用什么功能?