uni-3 log

    Search by

    bigqueryのwildcard tableの作成、更新

    wildcard tableはテーブル名に任意のsuffixをつけて作成することで クエリの際、wildcardを使ってテーブルスキャン範囲を指定できる便利機能のこと

    データ取得の際など、スキャン範囲を簡単に指定できるので重宝する。作成する際のスキーマの管理方法をどうするかなど、試したことを残しておく

    テーブル作成時のスキーマ定義

    基本的にテーブルとしては別扱いになる

    画面上でまとまって見えていても別テーブルなので、スキーマは異なっていても問題ない

    例えば↓のようなテーブルを作成できる。テーブル名とかカラムは適当

    console上では日付部分(20210701)などがまとまって表示される

    CREATE TABLE `working_detail_20210601`
    (
      id STRING
      name STRING
    );
    
    CREATE TABLE `working_detail_20210701`
    (
      title STRING
    )

    20210601 20210701

    もちろんスキーマの追加もできる

    bq update `working_detail_20210701` ./schema.json
    # schema.json
    [
        {
            "name": "title",
            "type": "STRING",
            "mode": "NULLABLE"
        },
        {
            "name": "id",
            "type": "STRING",
            "mode": "NULLABLE"
        }
    ]

    これより、スキーマ定義はwildcard tableを作る際に指定するようにする

    クエリするテーブルが異なるスキーマをもつとき

    どうやらカラム情報は最新のテーブルを参照する(ここでは20210701のものを参照する)

    例えば、以下を実際にクエリするとUnrecognized name: name at [3:3]などとでる

    selectの値をtitleだけにすると実行は通る

    SELECT
      id
      ,name
      ,title
    FROM `working_detail_*` 
    WHERE _TABLE_SUFFIX BETWEEN '20210501' AND '20210701'

    念の為スキャン範囲変えたりcliで試しても同じだった

    bq query --use_legacy_sql=false \
    'SELECT
      id
      ,name
      ,title
    FROM `working_detail_*`
    WHERE _TABLE_SUFFIX BETWEEN "20210501" AND "20210601"'

    どのテーブルであってもスキーマ定義は統一しておくとよさそうである

    所感

    公式ドキュメントなんかの例をみると、すでにあるテーブルの特定列(国名など)のdistinctをsuffixに使う、などとしていたりする

    新規作成するものと言うより、後々分割したい単位ができた時にwildcard tableとして転写する用途を想定しているのかもしれない

    分割単位が日付であればパーティションテーブルを使う選択肢もありえる

    参考

    2021, Built with Gatsby. This site uses Google Analytics.