2

それぞれ 57,191 行の 2 つのテーブルを結合しようとしています。BigQ は、内側/左側の大きなテーブルと右側の小さなテーブルを探しています。左側のテーブル B で実行すると、「大きなテーブル A が最初に表示される必要があります」というエラーが表示されます。クエリを切り替えてテーブル A を From 句に入れると、「大きなテーブル B が最初に表示される必要があります」というエラーが表示されます。したがって、指示どおりに実行すると、修正されませんが、何らかの方法で失敗しない限り、最初の(間違った)試行が提案されます。

2 つのテーブルが同じサイズである場合、おそらく一方が他方よりも小さくないことに基づいて、一方が大きいと判断するのは少し皮肉なことです。テーブルの1つに無意味な行を追加し、結合が機能した後に削除しようとすることを含まない解決策を見つけようとしています(BigQは現在、単一行のcsvファイルをロードしていないため、私のミスでした。)

Google SQL構文の結合ルールは

"join_type Bigquery は、INNER (デフォルト) および LEFT OUTER 結合をサポートします。table_2 これは、結合の 2 番目のテーブルであり、小さい必要があり、FROM 句に表示されるテーブルに結合されます。これは、いずれかのテーブルであることに注意してください。 name または別の SELECT 句 (この場合、エイリアスを指定する必要があります) join_condition_1, ..., join_condition_N, ... 一連の結合条件 (行に対してすべてが満たされる必要がある等価条件のコレクションである必要があります) (つまり、これらの条件を AND で接続することのみをサポートしています。)"

私が実行している実際のSQLは

SELECT lt.activeprosperloans,[fieldsredacted], ...
FROM prosperloans1.listings2 AS lt
JOIN prosperloans1.zjoinedperfloans as ln
ON lt.key = listingkey;

実際のエラーは次のとおりです: エラー: 大きなテーブル prosperloans1.zjoinedperfloans は、結合クエリの左端のテーブルとして表示される必要があります

ありがとうショーン

4

2 に答える 2

3

JOIN EACH を使用して、問題を効果的に解決できることに注意してください。

クエリは次のようになります。

SELECT lt.activeprosperloans,[fieldsredacted], ...
FROM prosperloans1.listings2 AS lt
JOIN prosperloans1.zjoinedperfloans as ln
ON lt.key = listingkey;

ドキュメントから:

可能であれば、最適なパフォーマンスを得るために、EACH 修飾子なしで JOIN を使用してください。テーブルのサイズが大きすぎて JOIN できない場合は、JOIN EACH を使用します。

https://developers.google.com/bigquery/docs/query-reference#joins

于 2013-05-30T18:24:11.680 に答える
1

この質問に答えたので、BigQuery は JOIN EACH を追加しました。これは 2 つの大きなテーブルを結合する方法です。JOIN EACH の使用方法については、Fh の回答を参照してください。

この応答の残りの部分は、歴史的な目的のためのものです: 大きなテーブル (結合のため) は 7 MB を超えるものです。結合を行うために、小さなテーブル全体がクラスター内のすべてのノードに送信されるため、かなり大きな制限を設けています。両方とも同じ行数であるにもかかわらず、一方のテーブルが 7 MB よりも大きく、もう一方のテーブルはそれよりも小さい可能性があります。

いずれかのテーブルのサイズを縮小する 1 つの方法は、クエリでフィルターと列フィルターを適用し、結果を別の一時テーブルとして保存してから、一時テーブルに JOIN を適用することです。たとえば、1 か月分のデータにまたがるテーブルに 10 列あるが、結合クエリと前日のデータに 3 列しか必要ない場合、最初に 3 つの列と最近のデータを選択し、結果を名前。次に、そのテーブルに対して結合を実行できます。

于 2012-07-31T01:22:03.157 に答える