2016-07-15 16 views
0

このことから、questionランダムサンプリングを行うことができることがわかりますRAND無作為抽出サンプリング行

SELECT * FROM [table] WHERE RAND() < percentage

しかし、これは、全表スキャンを必要と同等のコストが発生します。もっと効率的な方法があるのだろうか?

tabledata.list APIを試していますが、indexが非常に大きい(つまり> 10000000)場合はになりました。この操作はO(1)ではないのですか?

bigquery .tabledata() .list(tableRef.getProjectId, tableRef.getDatasetId, tableRef.getTableId) .setStartIndex(index) .setMaxResults(1L) .execute()

答えて

0

私はpageTokenでページングtabledata.listをお勧めしますと、各ページからのサンプル行を収集します。これははるかに優れているはずです。

私が見るもう一つの(全く別の)オプションでは、ループ内で文法的にランダム(スナップショット)時間または(レンジ用)タイムフレームとデータの部分が必要なデータを抽出するだけでクエリを生成することができますTable Decorators
の使用です。
注意制限:これにより、7日以内のデータをサンプリングすることができます。

+0

私の使用例は、完全なテーブルIOを実行せずに、小さな一定数の行を均一にサンプリングすることです。 'pageToken'アプローチは、テーブル内のすべての行を処理する必要がありますか? –

+0

nope。あなたはいつでもページングを止めることができます –

0

tabledata.listは、特にテーブルの後半および後で見ているように、テーブル内の任意のルックアップに対して特に効果的ではありません。テーブル全体の効率的なデータ検索のために設計されているわけではありません。テーブルの最初の数ページ分のデータを見ているだけです。

テーブル内のすべてのデータに対して操作を実行しますが、クエリを実行しない場合は、代わりにを使用し、出力ファイルの行をサンプリングする必要があります。

関連する問題