質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
BigQuery

BigQueryは、Google Cloud Platformが提供しているビッグデータ解析サービス。数TB(テラバイト)またはPB(ペタバイト)の膨大なデータに対し、SQL風のクエリを実行し、高速で集計・分析を行うサービスです。

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

Q&A

解決済

3回答

9292閲覧

BigQueryでPARTITION BYなどを使った際、「allotted memory~」のエラーが起きる原因と理解について

SatoshiMaruyama

総合スコア16

BigQuery

BigQueryは、Google Cloud Platformが提供しているビッグデータ解析サービス。数TB(テラバイト)またはPB(ペタバイト)の膨大なデータに対し、SQL風のクエリを実行し、高速で集計・分析を行うサービスです。

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

0グッド

0クリップ

投稿2018/08/01 09:50

編集2018/08/02 01:45

BigQueryで、巨大データに対して「PARTITION BY」のWINDOW関数を使うと以下のようなエラーが返ってくるかと思います。

BigQuery

1Error: Resources exceeded during query execution: The query could not be executed in the allotted memory. Sort operator used for PARTITION BY used too much memory..

上記の理解について、2点質問です。

●テーブル内のデータ(=レコード)には「並び順」という概念がない。
その為「PARTITION BY」のように、全レコードの並び順を操作する処理を走らせると、
上記エラーが返るという理解で良いか。

●分散処理させる(例えば、テーブル内の大きな塊を最初にELSEやWHERE句などで外す)ことで、
本件は回避できるものか。

どうぞ、よろしくお願いします。

【追記1】

BigQuery

1WITH T1 as ( 2 SELECT 3 カラム1, 4 カラム2, 5 カラム3 6 FROM 7 テーブル1(2,000万レコード) 8 9 UNION ALL 10 11 SELECT 12 カラム1, 13 カラム2, 14 カラム3 15 FROM 16 テーブル2(5,000万レコード) 17) 18 19SELECT 20 ROW_NUMBER() OVER (PARTITION BY カラム1 ORDER BY カラム2, カラム3) as CNT 21FROM T1

▼結果

Error: Resources exceeded during query execution: The query could not be executed in the allotted memory. Sort operator used for PARTITION BY used too much memory..

【追記2】
現在、下記サイトを参考にしております。
引き続き、よろしくお願いします。

「大きなデータを取得する」
https://tech.starttoday-tech.com/entry/bigquery_data_reduction#%E5%A4%A7%E3%81%8D%E3%81%AA%E3%83%87%E3%83%BC%E3%82%BF%E3%82%92%E5%8F%96%E5%BE%97%E3%81%99%E3%82%8B

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

sazi

2018/08/01 11:44

どんなSQLなのか追記して下さい
SatoshiMaruyama

2018/08/02 01:22

SQLを追記いたしました。どうぞよろしくお願いします。
guest

回答3

0

パーティション内の連番を取りたいということでしょうか。
リンク先(大きなデータを取得する)にもあるように、扱うデータを区切るしか無さそうですので、先ずは、パーティションで指定している単位を条件にして、order byの対象になる件数を減らすしか無い気がします。

投稿2018/08/02 02:06

sazi

総合スコア25173

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

allotted

allocated

だとは思いますが。

その為「PARTITION BY」のように、全レコードの並び順を操作する処理を走らせると、上記エラーが返るという理解で良いか。

メモリが足りないと言っていますから、PARTITION BY を削って良いならた削ったSQLで試されては?

●分散処理させる(例えば、テーブル内の大きな塊を最初にELSEやWHERE句などで外す)ことで、本件は回避できるものか。

条件で対象データを絞り込めるならリソースは少なくなりますが、実際に使えるメモリ、テーブルの全レコードの件数、絞り込んだ時の件数、SQLとそのSQLを実行できるだけのTABLE定義(そのまま提示できなければテーブル名やカラム名を差支えないものに置換)を提示すると適切なコメントが付き易いです。

投稿2018/08/01 10:48

Orlofsky

総合スコア16415

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

SatoshiMaruyama

2018/08/02 01:25

ありがとうございます。SQLを追記しました。求めている結果は、SQL記述の通り「PARTITION BY カラム1の中で」という制約がかかります。すみませんが引き続きよろしくお願いします。
Orlofsky

2018/08/02 03:16 編集

件数の多いテーブルをUNION ALLして、WHEREでデータを絞り込むようなこともしていないので、かなり厳しいです。 SELECTを複数に分けてそれぞれWHEREで条件を変えることで対応できないか検討されては?
yuukive

2020/01/09 04:11

allottedでも割当という意味があるので合ってると思います。 (BQのエラーメッセージ) `The query could not be executed in the allotted memory.`
Orlofsky

2020/01/09 10:13

合っていましたか。間違ったコメントをしてすみません。
guest

0

自己解決

皆様
ご回答ありがとうございました。

やはり、大きいデータをUNIONして、WHERE句の絞り込み無しでは厳しかったです。

主旨・用途は異なりますが、WHERE句でデータを落とさず、レコード数を減らす方法として、
以下のように、GROUP BYしたユニークID毎に、複数あるレコードの当該カラムを
カンマ区切り等の配列関数(ARRAY_AGG、STRING_AGG)で集約させました。
また、「ARRAY_AGG関数」については、MODIFY_DATEでソートした最新データを正として
取得する処理にしました。結果、効果的でした。

SQL

1SELECT 2 ID, 3 ARRAY_AGG ( カラムA ORDER BY MODIFY_DATE DESC )[OFFSET(0)] as カラムA(最新版のみ取得), 4 STRING_AGG( カラムA ORDER BY MODIFY_DATE DESC ) as カラムA(カンマ区切り 全て取得) 5FROM ( 6 SELECT DISTINCT 7 ID, 8 カラムA 9 MODIFY_DATE 10 FROM テーブル 11) 12GROUP BY ID 13

投稿2018/08/23 00:46

SatoshiMaruyama

総合スコア16

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問