13

2 つの大きなデータ セットを結合するクエリを実行しようとしていますが、クエリ実行中にリソースを超えてエラーが発生しています。Join Each と Group Each を使用するときに回避策があることを読みましたが、それらの回避策はありません。

SELECT 
  year(users.firstseen) as first_year,
  month(users.firstseen) as first_month, 
  DATEDIFF(orders.timestamp,users.firstseen) as days_elapsed,
  count(orders.user_key) as count_orders
FROM 
  [project.orders] as orders
JOIN EACH
  [project.users] AS users
ON
  orders.user_key = users.user_key
WHERE orders.store = 'ios'
GROUP EACH BY 1,2,3

編集:以下が機能しました:

SELECT
  year(users.firstseen) as firstyear,
  month(users.firstseen) as firstmonth,
  DATEDIFF(orders.timestamp, users.firstseen) as days_elapsed,
  COUNT(users.firstseen) AS count_orders FROM [project.orders] as orders
JOIN EACH( SELECT user_key, firstseen FROM [project.users]
WHERE store_key = 'ios') as users ON orders.user_key = users.user_key
GROUP BY firstyear, firstmonth, days_elapsed
ORDER BY firstyear, firstmonth, days_elapsed
4

1 に答える 1

13

JOIN EACH は、結合キー (この場合は user_key) が不均等に分散されていると失敗する可能性があります。たとえば、異常な頻度で表示される user_key が 1 つある場合、そのキーを処理するノードから「リソースを超えました」というエラーが発生します。または、結合前にユーザー キーの一部を除外することにより、ユーザー キーのより小さなセットに対してクエリを実行することもできます。

個別のグループ キーが多すぎる場合、GROUP EACH BY は失敗する可能性があります。これが当てはまるかどうかを確認するために、さらにいくつかの WHERE 句を追加して、結合出力を絞り込むことができます。

基本的に、クエリが機能するまで、入力を JOIN EACH または GROUP EACH BY のいずれかに絞り込むことをお勧めします。そうすれば、実行している制限をよりよく理解できます。それが分かれば、(うまくいけば) クエリを構造化して、利用可能なリソースを最大限に活用できます。

(ちなみに、近い将来これらの操作を調整して、ヒットする可能性のある制限の一部を削除する予定です!)

于 2013-05-16T05:25:37.717 に答える