在 BigQuery 中将数据插入/创建分片/通配符表

Posted

技术标签:

【中文标题】在 BigQuery 中将数据插入/创建分片/通配符表【英文标题】:Insert data into / creating a sharded/wildcard table in BigQuery 【发布时间】:2020-04-09 09:02:28 【问题描述】:

在 gcp 上有很多关于 querying 分片/通配符表 [1][2] 的文档,但我似乎无法弄清楚如何创建或将数据插入到诸如表中.

这是一个微不足道且几乎毫无意义的例子:

-- STANDARD SQL

CREATE TABLE IF NOT EXISTS  `mydataset.mytable_CA` AS
SELECT "CA" as COUNTRY_CODE

CREATE TABLE IF NOT EXISTS  `mydataset.mytable_US` AS
SELECT "US" as COUNTRY_CODE

SELECT * FROM `mydataset.mytable_*` WHERE _TABLE_SUFFIX = "CA"

CREATE 语句中的通配符

如何在 create 语句中使用通配符?

-- STANDARD SQL
-- DOES NOT WORK
CREATE TABLE IF NOT EXISTS  `mydataset.mytable_*` AS
SELECT "US" as COUNTRY_CODE WHERE _TABLE_SUFFIX = "US"

INSERT 语句中的通配符

同样,我如何进行插入?

是否可以按照以下方式做一些事情:

-- STANDARD SQL
-- DOES NOT WORK
INSERT INTO `mydataset.mytable_*` WHERE _TABLE_SUFFIX = COUNTRY_CODE
SELECT * FROM UNNEST(["US", "US", "CA"]) as COUNTRY_CODE

我知道建议使用分区和集群,但我特别询问通配符,所以请放纵我:)

这可能使用标准 SQL 吗?如果没有,那么旧版 SQL 怎么样?

[1]https://cloud.google.com/bigquery/docs/reference/standard-sql/wildcard-table-reference [2]https://cloud.google.com/bigquery/docs/querying-wildcard-tables

【问题讨论】:

据我所知,您不能在创建和插入语句中使用通配符。如果您想这样做,您可以使用 Python 等外部编程语言来动态创建查询并运行它。 【参考方案1】:

如您所见here,DMLBigQuery 中有一些限制,其中之一是:

包含数据操作语言 (DML) 语句的查询 不能使用通配符表作为查询的目标。例如,一个 通配符表可以用在 UPDATE 查询的 FROM 子句中,但是 不能将通配符表用作 UPDATE 操作的目标。

换句话说,您不能使用通配符来指定要创建、更新或插入新记录的表。尽管如此,您仍可以使用它来指定日期的来源。

让我们看一些如何在 DML 和 DDL 中使用通配符的示例。

插入

如果要将数据插入通配符表,则需要将数据插入最终表。也就是说,需要指定包含后缀的完整路径。

INSERT INTO `mydataset.mytable_US` <your query or your values>

如果您使用通配符表作为在普通表中插入数据的数据源,则可以在WHERE 子句中使用通配符:

INSERT INTO `mydataset.mynormaltable` 
SELECT <fields> 
FROM `mydataset.mytable_*` 
WHERE _TABLE_SUFFIX = "US"

创作

同样,您不能在目标中使用通配符,但可以使用它来指定数据源:

CREATE TABLE IF NOT EXISTS  `mydataset.normal_table` 
AS SELECT <fields> 
FROM `mydataset.mytable_*` 
WHERE _TABLE_SUFFIX = "US"

如果你想创建一个新的具有相同前缀的通配符表,你可以这样做:

CREATE TABLE IF NOT EXISTS  `mydataset.mytable_GB` 
AS SELECT <fields> 
FROM `mydataset.table`

在本例中,您创建了一个名为 GB 的新后缀。在此之后,您将能够正常查询带有 GB 后缀的表。

最后,我想在此附上对DML 和DDL 的引用,用于BigQuery

希望对你有帮助

【讨论】:

以上是关于在 BigQuery 中将数据插入/创建分片/通配符表的主要内容,如果未能解决你的问题,请参考以下文章

Bigquery 分片与 Bigquery 分区

bigquery 通配符表查询不允许选择某些字段

使用云功能从云存储中将数据加载到BigQuery中(替代功能?)

如何在新的 bigquery 项目中将表复制到空数据集?

如何在 BigQuery 中将结构插入(或修改)到 ARRAY<STRUCT<STRING, STRUCT>>?

查询 Bigquery 重复字段