web-dev-qa-db-ja.com

BigQuery-スキーマから未使用の列を削除します

BigQueryテーブルスキーマに誤って間違った列を追加しました。

テーブル全体(数百万行)をリロードする代わりに、次のことが可能かどうかを知りたいです。

  • ある種のフィルターを使用してテーブルで「select *」クエリを実行し、結果を同じテーブルに保存して、不良行(値のある行に間違った列が含まれている)を削除します。
  • (現在の)未使用の列を削除します。

この機能(または同様の機能)はサポートされていますか?おそらく、「結果をテーブルに保存する」機能には「コンパクトスキーマ」オプションがあります。

11
Lior

テーブルがレコード/繰り返しタイプのフィールドで構成されていない場合、簡単なオプションは次のとおりです。

  1. 不良レコードを新しい一時テーブルに除外しながら、有効な列を選択します

    SELECT <元の列のリスト>
    YourTableから
    WHERE <ここで不正なエントリを削除するためのフィルタ>

    上記を一時テーブルに書き込みます-YourTable_Temp

  2. 「壊れた」テーブルのバックアップコピーを作成します-YourTable_Backup

  3. YourTableを削除します
  4. コピーYourTable_TempからYourTable
  5. すべてが期待どおりに見えるかどうかを確認し、そうである場合は、一時テーブルとバックアップテーブルを削除します

注意:上記の#1のコストは、質問の最初の箇条書きのアクションとまったく同じです。残りのアクション(コピー)は無料です

フィールドを繰り返し/記録している場合-上記の計画を実行することはできますが、#1ではいくつかを使用する必要があります BigQueryユーザー定義関数 出力に適切なスキーマを含める
以下の例をご覧ください-もちろん、これには追加の開発が必要になります-しかし、危機的な状況にある場合は、これでうまくいくはずです

レコードタイプ列を持つテーブルを作成します
列タイプがRECORDのテーブルを作成する

ある時点で、Google BigQueryチームが、繰り返し/記録データを操作および出力する必要がある場合に、あなたのようなケースに対してより良いサポートを追加することを願っていますが、今のところ、これは私が見つけた最善の回避策です-少なくとも私にとっては

10

結果をテーブルに保存するのがあなたのやり方です。興味のある列を選択して大きなテーブルを試してみてください。制限を適用して小さくすることができます。

0
Pentium10

以下はそれを行うためのコードです。 cが削除したい列だとしましょう。

CREATE OR REPLACE TABLE transactions.test_table AS
SELECT * EXCEPT (c) FROM  transactions.test_table;

または2番目の方法で、私のお気に入りは以下の手順に従うことです。

  1. 除外する列を含むSelectクエリを記述します。
  2. クエリ設定に移動 クエリ設定
  3. [宛先設定]クエリ結果の宛先テーブルを設定し、手順1で入力したものとまったく同じプロジェクト名、データセット名、およびテーブル名を入力します。
  4. [宛先テーブルの書き込み設定]で、[テーブルの上書き]を選択します。 宛先テーブル設定
  5. クエリ設定を保存して、クエリを実行します。
0