从Dataflow python作业写入bigquery中的分区表

时间:2018-11-27 17:01:48

标签: python google-bigquery google-cloud-dataflow apache-beam

当我从数据流中写入bigquery中的分区表时,出现以下错误-有人可以帮助我吗?

  

无效的表ID \“ test $ 20181126 \”。表ID必须是字母数字(加下划线),并且最长不能超过1024个字符。另外,不能使用表装饰器。

这是我用来编写的python代码段

import apache_beam as beam


class bqwriter(beam.PTransform):
    def __init__(self, table, schema):
        super(BQWriter, self).__init__()
        self.table = table
        self.schema = schema

    def expand(self, pcoll):
        pcoll | beam.io.Write(beam.io.BigQuerySink(
            self.table,
            schema=self.schema,
            create_disposition=beam.io.BigQueryDisposition.CREATE_IF_NEEDED,
            write_disposition=beam.io.BigQueryDisposition.WRITE_TRUNCATE
        ))

我正在创建如下所示的Tabe

a | 'BQWrite' >> BQWriter("test-123:test.test$20181126", table_schema)

2 个答案:

答案 0 :(得分:1)

我有同样的问题。我的解决方案是:

  • 要么在数据中添加日期列,然后将BQ表设置为要对其进行分区

  • 或在BQ的_PARTITIONTIME设置默认分区。

这两个选项都意味着您只能插入test-123:test.test

关于我们是否应该能够做您想做的事情,看来是可以的。 Beam JIRA指出他们已针对Java对其进行了修复,但我找不到python的状态。

答案 1 :(得分:0)

最好的方法是将函数传递给原生 beam.io.WriteToBigQuery 类:

def table_fn(element):
    current_date = date.fromtimestamp(element['timestamp']).strftime("%Y%m%d")
    return f"{bq_output_table}${current_date}"

user_parent_user_watchever_pcol | "Write to BigQuery" >> 
beam.io.Write(
    beam.io.WriteToBigQuery(
        table_fn,
        schema=schemas.VIDEOCATALOG_SCHEMA,
        method="STREAMING_INSERTS",
        write_disposition=beam.io.BigQueryDisposition.WRITE_APPEND,
        create_disposition=beam.io.BigQueryDisposition.CREATE_NEVER,
    )
)