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_RANGE
和tableYYYYMMDD
,您可能必须每天创建不同的表。您仍然可以使用分区表来执行相同的任务,唯一的区别是您可以选择: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 错误