【问题标题】:Does apache_beam Python SDK 0.6.0 BigQuerySink support table partitions?apache_beam Python SDK 0.6.0 BigQuerySink 是否支持表分区?
【发布时间】:2017-05-17 21:22:26
【问题描述】:

我一直在使用他们的 python SDK 对梁管道进行原型设计,并且已经能够使用 BigQuerySink 来输出我的最终 pcollection 就好了:

     beam.io.Write(beam.io.BigQuerySink('dataset.table', 
                                self.get_schema(),
       create_disposition=beam.io.BigQueryDisposition.CREATE_IF_NEEDED,                                               
     write_disposition=beam.io.BigQueryDisposition.WRITE_TRUNCATE))

修改表以包含如下分区:dataset.table$20170517 在尝试使用 DirectRunner 运行此管道时触发以下错误


“代码”:400, "message": "无法从未分区的表中读取分区信息:


我研究了此处找到的示例,但没有发现分区使用的痕迹 https://github.com/apache/beam/tree/master/sdks/python/apache_beam/examples

如何将数据传送到分区的 bigquery 表中?

【问题讨论】:

  • 看代码,好像确实支持表分区。 (github.com/apache/beam/blob/release-0.6.0/sdks/python/…)。您的表是否正确分区?我正在检查 DirectRunner 是否支持该操作。
  • 你的表真的分区了吗?
  • @pablo @Graham Polley:是的,表是分区的。当我bq show 表时,我得到 "timePartitioning": { "type": "DAY" } 现在,在我执行管道并加载数据而不指定分区后,分区信息将被删除。就好像 BigQuerySink 从表中删除了分区一样。

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


【解决方案1】:

apache_beam Python SDK 接受 BigQuerySink 的分区装饰器。尝试不同的可用 write_disposition 会发现更多信息。

  • WRITE_TRUNCATE 不会写入表分区。在表名中使用 $YYYYmmdd 分区将导致此错误。这与实际接受分区装饰器的 Google Python SDK 行为不同。

    Table IDs must be alphanumeric (plus underscores) and 
    must be at most 1024 characters long. 
    
  • WRITE_EMPTY 将接受分区装饰器。
  • WRITE_APPEND 将接受分区装饰器。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-09-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-05
    • 2013-12-07
    • 1970-01-01
    相关资源
    最近更新 更多