BigQuery 插入作业而不是流式传输

Posted

技术标签:

【中文标题】BigQuery 插入作业而不是流式传输【英文标题】:BigQuery insert job instead of streaming 【发布时间】:2016-12-30 14:46:38 【问题描述】:

我目前正在使用 BigQuery 的流选项将数据加载到表中。但是,具有日期分区的表不显示任何分区...我知道这是流式传输的影响。

我使用的 Python 代码:

def stream_data(dataset_name, table_name, data):
    bigquery_client = bigquery.Client()
    dataset = bigquery_client.dataset(dataset_name)
    table = dataset.table(table_name)

    # Reload the table to get the schema.
    table.reload()
    rows = data
    errors = table.insert_data(rows)
    if not errors:
        print('Loaded 1 row into :'.format(dataset_name, table_name))
    else:
        print('Errors:')
        print(errors)

日期分区表最终会显示吗?如果没有,我如何创建插入作业来实现这一点?

【问题讨论】:

“具有日期分区的表不显示任何分区” - 你能详细说明一下吗?我们流式传输到最新的分区表,没有任何问题。 在 Web UI 中我只能看到一个表。在另一个数据集(我没有创建)中,我可以看到一个表,但表名后面的括号中的分区数量,然后我可以使用“tablenameYYYYMMDD”查询该表。我想实现这一目标。 补充:也可以使用TABLE_DATE_RANGE 您似乎对新的分区表功能和旧的方式感到困惑,即每天手动创建一个分区表。 @Will 在下面完美地解释了它。读一读 - cloud.google.com/blog/big-data/2016/03/… 【参考方案1】:

不确定您所说的“未显示分区”是什么意思,但是当您创建分区表时,您只会看到一个表。

这里唯一的区别是您可以在此表中查询日期分区,如下所示:

SELECT
  *
FROM
  mydataset.partitioned_table
WHERE
  _PARTITIONTIME BETWEEN TIMESTAMP('2016-12-25')
  AND TIMESTAMP('2016-12-31');

正如您在此示例中所见,分区表具有元列 _PARTITIONTIME,您可以使用它来选择您感兴趣的分区。

更多信息,这里是docs 解释更多关于查询分区表中的数据。

【讨论】:

感谢您的回答。我想要实现的是可以这样查询表:SELECT * FROM tableYYYYMMDD 来简化查询。我怎样才能做到这一点? 补充:也可以使用TABLE_DATE_RANGE 我认为使用分区表不可能做到这一点。要使用TABLE_DATE_RANGEtableYYYYMMDD,您可能必须每天创建不同的表。您仍然可以使用分区表来执行相同的任务,唯一的区别是您可以选择:select * from table where _partitiontime = timestamp(date)select * from table where _partitiontime between date1 and date2,这相当于 table_date_range 操作。

以上是关于BigQuery 插入作业而不是流式传输的主要内容,如果未能解决你的问题,请参考以下文章

GoogleApiException:流式传输到 BigQuery 时,Google.Apis.Requests.RequestError 后端错误 [500]

是否可以在保留缓存的同时流式传输到 BigQuery 分区表?

BigQuery 中的数据流/Beam 流式插入导致 SSL 错误

使用java将json数据流式传输到Bigquery中。不使用作业加载数据

Google Bigquery 插入流式传输

Bigquery 流式插入使用具有空字段的数据流