如何在 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 上创建架构?

保存视图无法在 Google BigQuery 中创建有效的输出架构

单独 JSON 文件中的 Terraform Bigquery 表架构