Google BigQuery API,如何设置destinationTable 的字段类型?

Posted

技术标签:

【中文标题】Google BigQuery API,如何设置destinationTable 的字段类型?【英文标题】:Google BigQuery API, How to set the field type of destinationTable? 【发布时间】:2015-01-21 06:33:01 【问题描述】:

我们正在使用 BigQuery 的 Python API(特别是 jobs 资源)对现有 BigQuery 表运行查询,并通过将结果数据集插入新的 BigQuery 表 (destinationTable) 来导出结果。

有没有办法同时更新新创建的表的架构并设置特定的数据类型?默认情况下,所有字段都设置为“字符串”类型,但我们需要其中一个字段为“时间戳”。

【问题讨论】:

【参考方案1】:

为了设置目标表的字段类型,您需要在查询中 CAST 为新类型,因为结果集描述了目标表中的新字段类型。

    您需要使用简单的 CAST 函数来获得类似数字/日期。

SELECT TIMESTAMP(t) AS t FROM (SELECT "2015-01-01 00:00:00" t)

    最近它为记录类型引入了“unflatten”功能,因此您现在可以将整个记录传输到另一个表,同时保留 RECORD 结构 - 为此您需要设置目标表(以及所需的写入处置),设置 allowLargeResults =TRUE,然后设置 Flatten Results=FALSE(参见here 中的最后一篇文章,其中有解释)。然后您可以运行这样的查询将整个记录传输到目标表:

选择单元格。* FROM publicdata:samples.trigrams LIMIT 0;

我正在使用 publicdata:samples 数据集中的表,您也可以使用该数据集,因此您也可以运行这些测试。在上面的查询中,'cell' 是一条记录,如果你设置 Flatten Results=FALSE,你会看到 'cell' 在你的 dest 表中仍然是一条记录。

    在将数据传输到目标表时,您可以从记录中删除一些字段。这是演示这一点的查询(同样,您需要使用 Flatten Results=FALSE 运行它):

SELECT cell.value, cell.volume_count FROM publicdata:samples.trigrams 限制 0;

运行上述查询后,“单元格”记录将只包含您指定的字段。

    在将数据传输到目标表时,您可以重命名记录中的现有字段:

SELECT cell.value AS cell.newvalue FROM publicdata:samples.trigrams 限制 0;

    很遗憾,目前无法向记录添加字段,例如,以下查询将在“actor_attributes”和“存储库”记录之外创建“url”。

选择 actor_attributes.blog, repository.created_at, repository.url AS actor_attributes.url FROM publicdata:samples.github_nested 限制 0;

因此,为了向记录添加字段,您需要导出数据,在 BigQuery 之外对其进行处理,然后使用新架构将其加载回来。

【讨论】:

【参考方案2】:

将自动设置目标表的字段类型。如果您需要将字符串转换为整数或时间戳,请在查询中进行。

这将创建一个包含一列(字符串)的目标表:

SELECT x FROM (SELECT "1" x)

这将创建一个包含一列(整数)的目标表:

SELECT INTEGER(x) AS x FROM (SELECT "1" x)

这将创建一个包含一列(时间戳)的目标表:

SELECT TIMESTAMP(x) AS x FROM (SELECT "2015-10-21 04:29:00" x)

【讨论】:

以上是关于Google BigQuery API,如何设置destinationTable 的字段类型?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 API 存储在 Google Cloud Storage 中的架构文件在 BigQuery 加载作业上设置架构?

如何在 Google App Engine 上为 BigQuery 设置截止日期

Google Spark-BigQuery-Connector如何利用BigQuery Storage API?

如何使用API 而不是使用Google BigQuery数据传输服务?

Python:如何快速上传到 Google BigQuery?

如何使用 Google Natural Language API 丰富 Bigquery 表中的数据?