为什么我的Python BigQuery Dataflow没有将记录插入数据库?

时间:2017-01-04 16:52:35

标签: python python-2.7 google-bigquery google-cloud-dataflow google-api-python-client

我使用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插入上面的日期格式。

2 个答案:

答案 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