如何在 Google BigQuery 中管理架构迁移
Posted
技术标签:
【中文标题】如何在 Google BigQuery 中管理架构迁移【英文标题】:How to manage schema migrations in Google BigQuery 【发布时间】:2018-08-14 05:07:57 【问题描述】:如何管理 Google BigQuery 的架构迁移,我们过去使用过 Liquibase 和 Flyway。我们可以使用什么样的工具来管理跨开发/暂存环境的架构修改等(例如添加新列)。
【问题讨论】:
此库执行架构迁移:github.com/medjed/bigquery_migration。另请参阅有关如何在 BigQuery 中手动更改架构的文档:cloud.google.com/bigquery/docs/managing-table-schemas 你找到适合你需要的工具了吗? 【参考方案1】:找到用于 BigQuery 架构迁移的开源框架
https://github.com/medjed/bigquery_migration
另一种解决方案
https://robertsahlin.com/automatic-builds-and-version-control-of-your-bigquery-views/
附言
在 flyway 中,有人打开了 ticket 以支持 BigQuery。
【讨论】:
【参考方案2】:Flyway 是一种非常流行的数据库迁移工具,现在作为 测试版 提供对 BigQuery 的支持,同时等待认证。
您可以在回答一个简短的调查后访问测试版:https://flywaydb.org/documentation/database/big-query。
我已经从命令行对其进行了测试,效果很好!我花了大约一个小时来熟悉 Flyway 的配置,现在用 yarn
命令调用它。
这是一个 NodeJS 项目的示例,文件结构如下:
package.json
fireway/
<SERVICE_ACCOUNT_JSON_FILE>
flyway.conf
migrations/
V1_<YOUR_MIGRATION>.sql
package.json
...
"scripts":
...
"migrate": "flyway -configFiles=flyway/flyway.conf migrate"
,
...
和flyway.conf:
flyway.url=jdbc:bigquery://https://www.googleapis.com/bigquery/v2:443;ProjectId=<YOUR_PROJECT_ID>;OAuthType=0;OAuthServiceAcctEmail=<SERVICE_ACCOUNT_NAME>;OAuthPvtKeyPath=flyway/<SERVICE_ACCOUNT_JSON_FILE>;
flyway.schemas=<YOUR_DATASET_NAME>
flyway.user=
flyway.password=
flyway.locations=filesystem:./flyway/migrations
flyway.baselineOnMigrate=true
然后,您可以随时致电yarn migrate
申请新的迁移。
【讨论】:
【参考方案3】:我为 Sequel 创建了一个适配器 sequel-bigquery
,因此我们可以将 BigQuery 数据库架构作为一组使用 Sequel 的 DSL 的 Ruby 迁移文件进行管理——就像我们对 PostgreSQL 数据库所做的那样。
示例
# migrations/bigquery/001_create_people_table.rb
Sequel.migration do
change do
create_table(:people) do
String :name, null: false
Integer :age, null: false
TrueClass :is_developer, null: false
DateTime :last_skied_at
Date :date_of_birth, null: false
BigDecimal :height_m
Float :distance_from_sun_million_km
end
end
end
require 'sequel-bigquery'
require 'logger'
db = Sequel.connect(
adapter: :bigquery,
project: 'your-gcp-project',
database: 'your_bigquery_dataset_name',
location: 'australia-southeast2',
logger: Logger.new(STDOUT),
)
Sequel.extension(:migration)
Sequel::Migrator.run(db, 'migrations/bigquery')
【讨论】:
【参考方案4】:根据BQ docs,您可以在架构中添加一行,而无需任何额外的过程。
对于更复杂的转换,如果可以在 SQL 查询中解决,您可以运行该查询 setting the destination table as the source table(尽管我建议 creating a backup of the table 以防出现问题)。
示例
假设我有一个表,其中有一列是整数(列d
),但在插入时它被写为字符串。我可以通过将自身设置为目标表并运行如下查询来修改表:
SELECT
a,
b,
c,
CAST(d AS INT64) AS d,
e,
f
FROM
`example.dataset.table`
这是一个更改架构的示例,但只要您可以通过 BQ 查询获得结果,就可以应用此示例。
【讨论】:
谢谢乔弗雷。但我的问题更多是关于如何在特定环境和跨环境中管理模式迁移。由于一个表可能会经历多次更改,我们希望有一个框架(例如 liquibase 或 flyway)来管理我们的模式迁移,以便可以根据需要灵活地部署或回滚您的更改。我想知道这个产品有哪些可用的工具。 我猜想使用Simba driver,您可以使用任何可以连接到 SQL DB 的工具,但从未尝试过,所以不知道效果如何。 我不认为上述驱动程序也有帮助,liquibase 和 flyway 提供了一种管理迁移的机制以上是关于如何在 Google BigQuery 中管理架构迁移的主要内容,如果未能解决你的问题,请参考以下文章
在 Google 跟踪代码管理器中使用 GA Bigquery 导出架构变量
如何通过 Terraform 管理 BigQuery 表的架构更改
如何使用 API 存储在 Google Cloud Storage 中的架构文件在 BigQuery 加载作业上设置架构?
如何从 Python 中的 App Engine 在 Google BigQuery 上创建架构?