【问题标题】:Streaming into Column-based partitioned Bigquery table "disallowed"?流到基于列的分区 Bigquery 表“不允许”?
【发布时间】:2018-09-24 01:31:00
【问题描述】:

是否支持将数据流式传输到按列分区的 BigQuery 表中?我遇到了问题,收到此错误:

BadRequest:400 POST https://www.googleapis.com/bigquery/v2/projects/...$20180410/insertAll:不允许流式传输到基于列的分区表的元数据分区 ...$20180410。

阅读 BigQuery streaming documentation 它说允许流式传输到分区表,但所有示例均适用于摄取时间分区。我没有看到对较新的基于列的分区的引用。

它是否受支持而我只是做错了? 例如,当我显式添加分区后缀 ($YYYYMMDD) 时出现错误。当我不使用后缀时,写入成功,但看起来它实际上并没有分区。

这是我的示例代码:

我们有一个包含几列的表,让我们这样说:

date: DATE (partitioned field)
name: STRING
count: INTEGER

我正在尝试通过以下方式进行流式插入:

from google.cloud import bigquery

data = [
    {'date': date('2018-04-10'), 'name': 'x', 'count': 10},
    {'date': date('2018-04-10'), 'name': 'y', 'count': 5},    
]
client = bigquery.Client(...)
table_ref = client.dataset(dataset).table(tableid + '$20180410')
schema = client.get_table(table_ref).schema

# Raises the 400 Bad Request above.
result = client.insert_rows(table_ref, data, selected_fields=schema)

【问题讨论】:

  • 请尝试删除 $20180410
  • 当我删除分区“$20180410”时,写入成功,但据我所知,数据实际上并未分区。如果我尝试通过bq rm ...$20180410 仅从分区中删除数据,则不会删除行。
  • 不允许流式传输到列分区表的特定分区。可以不带后缀流到表,数据会根据分区字段值分配到分区
  • 在您删除分区时,它可能仍在流缓冲区中。你能在几分钟后尝试删除吗?
  • 能否将您的完整表名与 projectid 和 datasetid 分享一下?

标签: google-bigquery google-python-api


【解决方案1】:

已更新/已解决(提示并感谢 Lei Chen。请参阅 cmets 进行讨论)

要流入分区表,不要在 tableid 上附加 $YYYMMDD。 BigQuery 将为您进行分区,但是......它似乎是一个单独的阶段。我的记录在几分钟内从流缓冲区出现在​​表中,但需要几个小时才能正确分区。

这在您使用摄取时间分区时更容易分辨,并且可以查询 _PARTITION 伪列。对于列分区,除了 bq rm-ing 分区并查看记录是否消失之外,我没有找到知道它是否已分区的好方法。

【讨论】:

  • 任何仍在分区表的流缓冲区中的内容都将显示在 UNPARTITIONED 分区中,直到它被提取,此时它将显示在正确的分区中。
  • 到目前为止,当您在查询中使用分区过滤器时,流式缓冲区数据会自动带入查询结果。批量上传文件也是如此。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-09-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-05-02
相关资源
最近更新 更多