我使用Python(2.7)并在Google的DataFlow环境中工作,不用说,谷歌还没有完全刷新所有内容,而且文档还不够充分。但是,从Dataflow到BigQuery的写入部分在此处记录BigQuery Sink。
根据文档,为了指定架构,您需要输入一个字符串:
schema = 'field_1:STRING, field_2:STRING, field_3:STRING, created_at:TIMESTAMP, updated_at:TIMESTAMP, field_4:STRING, field_5:STRING'
表名,项目ID和数据集ID如下所示:' example_project_id:example_dataset_id.example_table_name'
现在,所有这一切都在发挥作用。请参阅下面的代码,但从我所看到的,它成功创建了表和字段。注意:项目ID被设置为函数参数的一部分。
bq_data | beam.io.Write(
"Write to BQ", beam.io.BigQuerySink(
'example_dataset_id.{}'.format(bq_table_name),
schema=schema,
write_disposition=beam.io.BigQueryDisposition.WRITE_APPEND,
create_disposition=beam.io.BigQueryDisposition.CREATE_IF_NEEDED
)
)
现在,看起来我可以通过使用它来插入内容:
bq_data = pipeline | beam.Create(
[{
'field_1': 'ExampleIdentifier',
'field_2': 'ExampleValue',
'field_3': 'ExampleFieldValue',
'created_at': '2016-12-26T05:50:39Z',
'updated_at': '2016-12-26T05:50:39Z',
'field_4': 'ExampleDataIdentifier',
'field_5: 'ExampleData'
}]
)
但由于某种原因,当将值打包到PCollection中时,它表示它会插入到BigQuery中,但是当我查询表时,它什么都没有显示。
为什么不插入?我没有看到任何错误,但没有任何内容插入BigQuery。
这是PCollection中包含的数据,我有近1,100行要插入:
{'field_1': 'ExampleIdentifier', 'field_2': 'ExampleValue', 'field_3': 'ExampleFieldValue', 'created_at': '2016-12-29 12:10:32', 'updated_at': '2016-12-29 12:10:32', 'field_4': 'ExampleDataIdentifier', 'field_5': 'ExampleData'}
注意:我检查了日期格式,并允许BigQuery插入上面的日期格式。
答案 0 :(得分:0)
我尝试了一个具有确切模式和输入的示例,它对我有用。我必须做以下修复。
(1)好像你没有在你的论点中指定一个项目。您可能在管道定义中指定了此内容,因为您没有看到此错误。
(2)您在上面提到的代码中有一个拼写错误。
'field_5: 'ExampleData'
应为'field_5': 'ExampleData'
但我认为这只是这个问题中的一个错字,因为你没有收到错误。
您是否在运行最新版本的Dataflow?您可以尝试创建新的虚拟环境并运行“pip install google-cloud-dataflow”来安装最新版本。
是否可以分享您的完整pipleine供我试用?
由于您使用的是“DirectPipelineRunner”,因此很难远程调试。是否可以尝试使用'DataflowPipelineRunner'运行相同的管道(请注意,您需要一个为此启用计费的GCP项目)?如果你可以使用'DataflowPipelineRunner'运行它并提供作业ID,我将能够查看日志。
答案 1 :(得分:0)
这个答案很晚,但也许它可以帮助别人。管道中的写入语句写错了。
bq_data | 'Write to BigQuery' >>
beam.io.Write(beam.io.BigQuerySink(known_args.output_table,
schema=schema,
create_disposition=beam.io.BigQueryDisposition.CREATE_IF_NEEDED,
write_disposition=beam.io.BigQueryDisposition.WRITE_TRUNCATE)) # This is overwrite whatever you have in your table