同じエラーをスローする公開データに対する同等のクエリ:
SELECT actor, repository_name, count(*) AS count
FROM [githubarchive:github.timeline] AS d
GROUP EACH BY actor, repository_name
ORDER BY actor, count desc
同じクエリと比較して、返される結果に制限を加えます。これは機能します(私にとっては14秒):
SELECT actor, repository_name, count(*) as count
FROM [githubarchive:github.timeline] as d
GROUP EACH BY actor, repository_name
ORDER BY actor, count desc
LIMIT 100
LIMIT を使用する代わりに、user_id の一部を調べることができます。私の場合、1/3 が機能します。
SELECT actor, repository_name, count(*) as count
FROM [githubarchive:github.timeline] as d
WHERE ABS(HASH(actor) % 3) = 0
GROUP EACH BY actor, repository_name
しかし、本当に欲しいのは、「user_id ごとに最も多く表示されるアーティスト ID を取得する」ことです。さらに進んで、それを取得しましょう。
SELECT actor, repository_name, count FROM (
SELECT actor, repository_name, count, ROW_NUMBER() OVER (PARTITION BY actor ORDER BY count DESC) rank FROM (
SELECT actor, repository_name, count(*) as count
FROM [githubarchive:github.timeline] as d
WHERE ABS(HASH(actor) % 10) = 0
GROUP EACH BY actor, repository_name
))
WHERE rank=1
今回は %10 を使用したことに注意してください。結果が早く得られるからです。しかし、「10 回ではなく、1 回のクエリで結果を取得したい」と思うかもしれません。
そのためにできることは 2 つあります。
- パーティション分割されたテーブルを結合します(FROM 式のカンマは結合を行いますが、BigQuery の結合ではありません)。
- それでもリソースを超えている場合は、テーブルをマテリアライズする必要がある場合があります。元のクエリを実行し、結果を新しいテーブルに保存します。インメモリ GROUP ではなく、そのテーブルに対して RANK() アルゴリズムを実行します。
データセットを私と共有していただける場合は、データセット固有のアドバイスを提供できます (カーディナリティに大きく依存します)。