2016-09-08 59 views
5

BigQueryにAUTO_INCREMENT、SERIAL、IDENTITY、またはシーケンスのようなものがありますか?BigQueryに自動インクリメントがありますか?

私はROW_NUMBERについて認識していますhttps://cloud.google.com/bigquery/query-reference#row-number
しかし、テーブル内のすべての行に対して生成された一意のIDを保持したいとします。

+0

ROW_NUMBERは、各行の新しい「id」列を計算するためにクエリを実行し、結果を新しいテーブルとして保存した場合に機能します。 BigQueryは実際にはキーによる単一行の検索(テーブル全体をスキャンする必要があります)を意図していないため、他の列の組み合わせ行のためのより意味のある "アイデンティティ"を作る。これは下流の別のシステムで消費するためだけのものですか? –

+0

私はいくつかのソースからのデータをBQの同じテーブルに統合したいと考えています。これらのデータソースにはすでにIDがありますが、それらは互いに衝突する可能性があるため、後でアクセスするための統一されたIDを持っています。 IDによるアクセスに関しては、Datastoreに古いIDと新しいIDの間にマップのキャッシュバージョンを保存する予定だったので、BQで単一行ルックアップを行う必要はほとんどありませんでした。 – JoseKilo

+0

意味があります。私はいくつかの提案を追加しました。これがデータソースの和集合だけの場合は、一意性を保証するためのネームスペースプレフィックスキーが最も簡単な解決策となります(後で再生成する必要がある場合はROW_NUMBERよりも安定します)。 –

答えて

3

BigQueryには、読み込み時に行キー生成の概念がありません。あなたの行の任意のキーを生成するクエリでテーブルを書き換えることができます。

あなたが述べたように(あなたがすべて以上のパーティション分割されていない窓関数を必要とすると思いますので)、ROW_NUMBERはあなたの各行の一意のインデックスを与えるだろうが、あなたはsize limits for particularly large tablesを打つことがあります。

大きな文字列キーを使用できる場合は、各行にUUIDを生成することを検討してください(ランダムに行うことができ、残りのデータとの調整は必要ありません)。残念ながら、BigQueryには組み込みのUUID()関数はありませんが、RAND()をいくつか呼び出すと同等の処理を行うことができます。これは、JavascriptのUDFとして表現する方が簡単かもしれません。

リンク先の回答では、の組み合わせがのキーが異なる場合、Felipeは複合キーを作成します。