ラベル Google BigQuery の投稿を表示しています。 すべての投稿を表示
ラベル Google BigQuery の投稿を表示しています。 すべての投稿を表示

2013年6月12日水曜日

35.BigQueryの新機能 (2013/06/11)

このエントリーをはてなブックマークに追加


BigQueryに新しい機能が追加されたので早速試してみました。

Cloud Platform Blog: Google BigQuery gets bigger, faster, and smarter with big result sets and new analytics functions

◯Large results

- Destination Table
クエリ結果をテーブルに出力するための指定。
「Select table」ボタンを押して出力先テーブルの「プロジェクト」「データセット」「テーブルID(名前)」を指定する。

 -Write Preference
 テーブルへの書き込み設定。
 3つの選択肢があるが、どの選択肢でも「テーブルが無ければ新規に作成して書き込む」は同じ。
 その上でテーブルが既に存在している場合の挙動が下記のように異なる。

 ・Write if empty テーブルが既に存在している場合はエラー
 ・Append to table テーブルが既に存在している場合は追記する
 ・Overwrite table テーブルが既に存在している場合はテーブルを丸ごと削除してから新規に書き込む

 -Results Size - Allow Large Results
 通常「クエリの結果は128 MB以下」という制限がありそれを超えるとエラーになっていたが、
 このオプションを指定した場合はその制限がなくなる。
 このオプションにチェックするためには「Destination Table」を指定する必要があります。


クエリ結果をテーブルに書き込む事には2つの意味がありそうな気がします。

1.大規模な結果を取得して画面に表示する過程で使う一時テーブル的な位置づけ(たぶん)
2.大規模な結果を取得してテーブルに保存する、既存の「Save as Table」の改善的な位置づけ
 →既存テーブルのデータをクエリで加工して別のテーブルとして保存することも可能。
 以前は大きいテーブルに対してこれをする場合には日付の範囲等で行を絞って小分けにテーブルとして保存して、
 さらにそれらを一度ダウンロードしてから一つのテーブルに追記Uploadする必要があったのでとても楽になります。

これまでは結果データが大きすぎると「Response too large to return.」となって結果を取得できなかったので
画面に表示して閲覧することも、結果をテーブルとして保存することもできませんでしたが、
それができるようになった・・・はずなのですが、、
「Large Results」にチェックして下記のクエリを実行したら「Response too large to return.」 になりました。ぐぬぬ。

SELECT
    title,
    id,
    language,
    wp_namespace,
    is_redirect,
    revision_id,
    contributor_ip,
    contributor_id,
    contributor_username,
    timestamp,
    is_minor,
    is_bot,
    reversion_id,
    comment,
    num_characters
FROM
    [publicdata:samples.wikipedia] 
LIMIT 500000

本当は解決してからブログ書きたかったけど、これ以上は課金が怖いので棚上げして書いちゃう。`,、('∀`) '`,、

・・・そのうちまた試してみます(´・ω・`)

* 2013/6/14 追記 Google+ 経由でコメントいただきました
ある一つのクエリについて
・「Large Results」のチェックなしではエラーになった
・「Large Results」のチェックありでは結果を取得できた
を確認できたとご連絡いただきました。

しかし、上記のサンプルデータに対するクエリを試していただいたところ
こちらはやはりエラーになってしまったそうです。
改善されたのは確かなようですが、無制限というわけではないのかな・・・?


◯Window functions(分析用関数)の追加

例えば下記のような関数があります。

・rank() 結果データを特定のカラムでランク付けした順位
 →同じ順位が二行ある場合は次の順位が一つ飛ぶ(ex.1,2,3,3,5)

・dense_rank() 結果データを特定のカラムでランク付けした順位
 →同じ順位が二行あっても次の順位が飛ばない (ex.1,2,3,3,4)

・row_number() 結果データの行番号 (1から連番)

・percentile_cont(<percentile>) パーセンタイル (統計用語らしい 解説しているサイト)


他にも色々追加されたようです。
Query Reference#Window functions



◯Queryキャッシュ

- Query Caching Use Cached Results
・「Destination Table」を指定した場合には利用できない
・これにチェックしていると、クエリの結果としてキャッシュされた結果を表示する。 (デフォルトで有効)
・クエリはユーザごとの単位でキャッシュされる。(プライバシーを維持するため、とのこと)
・最後のクエリから変更していないテーブルに対してのみ適用される (テーブルを変更するとキャッシュが使われなくなる)
・キャッシュされた結果を参照するのは無料 (ただし一日あたりのクエリ回数のQuotaカウントには加算される)
・クエリの結果は24時間保持される (「ただしベストエフォート」との事なので早めに消えることもありそう)
・bqツール、APIもデフォルトはキャッシュが有効。オプションで無効にすることが可能
→クエリが参照するテーブルが前回実行時から変更されているとキャッシュを参照しないので、
 基本的には常にキャッシュを有効にしてよさげ

クエリ文字列をKeyに最終的な結果がキャッシュされているという感じ。
試しに
1回目 ソート順を指定してlimitを指定10
2回目 ソート順を指定してlimitを5
としたところ、
2回目のクエリで参照するデータは一回目に参照したデータに含まれているが、キャッシュを使わなかった。

ついでに試したてみたところ、
クエリ内の文字のCASE違いやスペースの有無は無視される。(キャッシュが使われる)



◯UIの改善 クエリ・バリデータ, コスト推定,クエリの中断,クエリの記録

-クエリ・バリデータ

リアルタイムにエラーを通知してくれるようになった。
 該当箇所が赤字になった上に、エラーメッセージが表示される。
 (以前はクエリを実行した後でエラーになって、エラーメッセージが表示されていた)


-コスト推定

 構文が有効であれば、クエリを実行した場合にどのくらいコストがかかるかを実行前に知らせてくれる。
 画面右の緑の●を押すとクエリが処理するデータサイズが表示される。(BigQueryではクエリ時に処理するデータ量に応じて課金される)
 この機能は「--dry_run」フラグを指定するとBQツールとAPIで使用可能らしい。


-クエリの中断が可能に

以前は一度クエリを実行すると、それが完了するまで次のクエリを実行できず完了を待つ必要がありましたが、
クエリを明示的に停止してすぐに次のクエリを実行できるようになりました。

「RUN QUERY」ボタンを押してクエリが開始すると「Abondon Query」ボタンに変わる。
「Abondon Query」ボタンを押すと確認ダイアログが出て「OK」を押すとクエリが止まる。
ただしあくまでUI的な話で、サーバーサイドでは処理が継続されるので途中で止めてもコストはかかるそうです。


- クエリを記録しておけるようになった
「Save Query」で名前をつけてクエリを記録できる。


◯価格改定

より手頃な価格に値下げする。

- 全てのユーザーに対して
 データストレージのコストが$0.12/GB/monthから$0.08/GB/monthになる。
 2/3になるのでかなり下がります。
 大規模データを扱うためのBigQueryなので、これはなかなかうれしい値下げです。

- 大規模ユーザーに対して
 使えば使うほど単位あたりの価格が割安になるような価格設定が用意されるようです。
 おそらくこの「Package pricing table」で、申し込めば月額課金のプランにできるようです。
 お値段は月額$3,300から。



◯Quotaの増加

全てのユーザーに対してインタラクティブなクエリのQuotaを倍増した。

Quota Policy - Google BigQuery — Google Developers






このエントリーをはてなブックマークに追加

2013年5月26日日曜日

32.Google BigQueryでAnalyticsとAdSenseのデータを分析する(Google I/O 2013)

このエントリーをはてなブックマークに追加




Ryo Yamasaki(@vierjp)です。

「BigQueryでGoogle AnalyticsとGoogle AdSenseのデータを分析する」というセッションについてのメモです。

I/Oではこの時間帯に別のセッションを聞いていたのでこの件について全く認識しておらず、
Google I/O報告会で初めて知ったので早速動画をチェックしてみました。

Google Analytics and AdSense Data Analysis in BigQuery (セッションページ)
動画


◯ BigQueryでAdsenseのデータを利用する

そのままではデータセット一覧にAdsenseのデータは表示されていませんが、
現時点で既に利用可能になっています。

・使えるテーブル
 DailyReport
 DailyAdUnitReport
 DailyCustomChannelReport
 DailyUrlChannelReport
 DailyDomainReport


・AdsenseのUIと比べて
 ・よりフレキシブルに好きな組み合わせや角度、基準で分析できる
 ・大量データに対して分析できる

・さらに
 ・一日中更新される
 ・Adsenseのデータに対するBigQueryからのQuery実行は無料

* 無料ってのはいいですね!


・クエリの例
 以下は売上の多いカスタムチャネルの一覧とその売上を取得するクエリです。

select custom_channel_id,
custom_channel_name,
sum(earnings) AS earnings
from
[google.com:adsense-reports:Reports.DailyCustomChannelReport]
GROUP BY
 custom_channel_id,
 custom_channel_name
ORDER BY
 earnings DESC
 LIMIT 5
結果がわかりづらかったのでセッション中でのクエリ例に「custom_channel_name」を追加しています。
 Adsenseを利用していてカスタムチャネルを設定しているならこのクエリで自分のAdsenseアカウントの結果を見ることができます。

* カスタムチャネルの命名が変かもしれませんがスルーしてくださいw


・テーブル定義の参照方法

AdSense BigQuery Integration Guide - AdSense — Google Developers」から
各テーブル名のリンクをクリックしてBigQueryのWebインタフェースに遷移するとデータセットにAdsenseのテーブル定義の一覧が追加されます。
(このURLからアクセスした場合のみ表示されるらしく、再度普通に開いても表示されない)

 BigQueryを操作しているのと同じGoogleアカウントに紐付くAdsenseのデータを参照するようです。


◯BigQueryでAnalyticsのデータを利用する


こちらはまだ一般公開されておらず、2013年9月のリリースを目指しているそうです。

・「Google Analytics プレミアム」のユーザーがAnalyticsのデータを「インポート」できるようになる。
 こちらはAnsenseのようにリアルタイムではなくデイリーでデータが更新されるそうです。
  (そもそもAnalytics自体の更新もリアルタイムではありませんが)
  Analyticsのプレミアムアカウントの存在を初めて知ったので調べてみたところ「想定価格 100万円/月」と、
  なかなかお高い。。

・利用できるデータはFirstPartyのデータだけで、AdwordsやGeographyと行ったデータは利用できない。
 (少なくとも2013年9月時点では)

・申請すれば開発者は事前に使えるかもしれないとのことです。
 Google Analytics Premium & BigQuery 申し込みページ


◯セッションで紹介されていたツール Tableau


Tableauというサードパーティ製のWindows用のGUIツールについて紹介していました。
複数のデータを同じ期間(条件)で並べてグラフ化して比較したり関連を見たりするデモでした。


◯まとめ

AdsenseにしてもAnalyticsにしても、
BigQueryを使って解析することで自社で持っている別の情報とJoinして分析できる事が魅力的かと思います。

例えばニュースサイトなら
「その日に公開した記事のカテゴリ」と「Adsenseの売上」「Analyticsのアクセス情報」
を結びつけて分析するような事もできるでしょう。

以前に書いた「23.BigQueryの新機能 (2013/03/15)」のBig JOINもこういった分析を手助けしてくれます。


Adsenseのデータはタダで分析できるのが良いですね。
分析した上での広告の最適化はGoogleにとってもメリットがあるからでしょうか。

Analyticsはお高く感じますが、BigDataの重要性が言われている昨今
AnalyticsのデータをBigQueryで自由に集計できる事には
マーケティング目的の分析において十分に見合う価値があるのかもしれません。




このエントリーをはてなブックマークに追加

2013年3月15日金曜日

23.BigQueryの新機能 (2013/03/15)

このエントリーをはてなブックマークに追加



BigQuery gets big new features to make data analysis even easier - Google Developers Blog

待望の新機能「Big JOIN」を始め、BigQueryに新しい機能が追加されました。
Big JOINについて試したのと、他の機能も少し読んでみたのでブログに書いてみます。

◯Big JOINとは

Big QueryではこれまでもテーブルのJOINをすることはできたのですが、
JOINするテーブルのサイズに制限がありました。
(クエリのメインのテーブルのサイズには元々制限は無いので、JOIN相手のテーブルに制限があるという感じ)

データ集計においてJOINを必要とする頻度は高く、
これまではBigQueryを使う際にこの制限を回避するための対応が必要でした。

具体的には、
1.JOIN対象のテーブルをサブクエリ化して不要な列や不要なレコードを削る (限界がある)
2.データ設計の時点でデータ集計を見据えてデータを保存しておく (新しいパターンに対応しづらい)
3.MapReduce等を使って「事前にJOINした後の状態のデータを作っておく」(とにかく手間がかかる)
等です。

* 私が以前に書いた下記のブログ記事を見ると、苦労が伺えるかと思います。。
10.Google App EngineとBigQuery ノウハウ編(3/3)
(「Joinの制限」が該当部分)


経験上この制限の回避に割く時間は集計クエリを作成する作業の中で結構な時間を占めていたと思います。
また、長期的に見た場合にデータの増加や新しい集計パターンに対処できなくなる懸念もありました。

それが今回のBig JOINのサポートによって、JOINするテーブルのサイズに制限が無くなりました。

これはBigQueryユーザーが上記の手間や懸念から開放される事を意味します。

よって、BIG JOINは多くのBigQueryユーザーが待ちに待った、
現在進行形の手間や今後の懸念を解消してくれる新機能と言えるでしょう。

今回この「Big JOINのサポート」により、
BigQueryでは2種類のJOINが可能になりました。

・Small JOIN (従来からあるJOIN)
 JOINするテーブルのサイズに制限があるが高速

・Big JOIN (新しく使えるようになったJOIN)
 JOINするテーブルのサイズに制限は無いがSmall Joinに比べて速度的には劣る
 ※サイズ制限について最後に追記あり(2013/03/19)

それぞれメリット・デメリットがあるので、ケースに応じて使い分けると良いでしょう。

参考:
Query Reference#JOIN clause


◯Big JOIN (JOIN EACH)を試してみる

以下は
「wikipediaテーブルのtitle」と「shakespeareテーブルのword」が一致するレコードを抽出する。
という簡単なクエリです。

各テーブルの件数は以下の通り
・wikipediaテーブル・・・約3億件
・shakespeareテーブル・・・約16万件

まずはBig JOINを使わずに試してみます。

SELECT
 title, id, timestamp
FROM [publicdata:samples.wikipedia] w,
JOIN [publicdata:samples.shakespeare] s on w.title=s.word
ORDER BY timestamp
limit 1000;

実行結果:
Query Failed
Error: Large table publicdata:samples.shakespeare must appear as the leftmost table in a join query

「shakespeareテーブルが大きすぎる」というエラーですね。
よろしい ならばBig JOINだ。
JOIN EACH」にして再実行してみると、

実行結果:
Query complete (14.0s elapsed, 11.5 GB processed)

Rowtitleidtimestamp
1Spirits26793982571938
2Spirits26793982571938
3Spirits26793982571938
4Jesus1095706983610563
5Jesus1095706983610563
6Jesus1095706983610563
7Jesus1095706983610563
8Doors7919983666981
9Doors7919983668101
10Stop26739983742576
・・・以下略・・・

となり、エラーにならずに結果を取得することができました。
確かにテーブルのサイズによる制限はなくなっているようです。
データ量によるので一概には言えませんが、BigQueryにしては少し時間がかかる印象は受けるかも?

それではSmall JOINも試してみましょう。
「shakespeareテーブル」をそのままJOINするのではなく、「word」列のみを取得するようにします。
列が減ることでJOIN対象のサイズが減るので、
これがSmall JOINの制限数値以内であればクエリを実行できるわけです。

SELECT
 title, id, timestamp
FROM [publicdata:samples.wikipedia] w,
JOIN 
(
 SELECT word
 FROM [publicdata:samples.shakespeare]
)s  on w.title=s.word
ORDER BY timestamp
limit 1000;

実行結果:
Query complete (4.9s elapsed, 11.5 GB processed)

(取得結果は同じ)

ドキュメントにも書いてある通り、たしかにSmall JOINの方が速そうです。

しかし実際には速度だけでは決められず、トレードオフが必要かもしれません。
バッチ処理から呼ぶ等でクエリの実行速度をそこまで求めない場合には
BIG JOINにしてしまえばクエリ作成は楽ですし、
「shakespeare」テーブルのデータが増大した結果Small JOINでは動かなくなる、という心配もありません。
速度が要求される、かつ今後も踏まえて心配が無いならSmall JOINで、
その確証が無いならBIG JOIN、という方針が無難でしょうか。

参考:
Query Reference#JOIN clause


◯GROUP EACH BYを試してみる

また、Big JOIN同様にGroup Byにも「EACH」の指定ができるようになりました。
Group Byの条件に指定した項目が大量の種類ある場合、
(つまりは「その項目をdistinctした際の件数」が大量にある場合)にクエリを実行できない問題も、
「EACH」を付けることで解消されます。
これもJOIN同様「可能であればEACHをつけない方がパフォーマンスは良い」とのことです。

簡単なクエリで試してみましょう。
「wikipediaテーブル」をtitleでGroup Byしてtitle毎の件数をカウントします。
こちらもまずは「EACH」を指定せずに実行します。

SELECT title, count(*) as cnt
FROM [publicdata:samples.wikipedia] s
GROUP BY title
order by cnt DESC
limit 1000;

実行結果:
Query Failed
Error: Resources exceeded during query execution. The query contained a GROUP BY operator, consider using GROUP EACH BY instead. For more details, please see https://developers.google.com/bigquery/docs/query-reference#groupby

エラーになりました。異なる「title」のレコードなんて大量にありそうですもんね。
「代わりにGROUP EACH BYを使え」というエラーメッセージ。
ドキュメントのリンクまで書いてあってとても親切です。

GROUP EACH BYにして再実行すると、今度は取得できました。

実行結果:
Query complete (10.2s elapsed, 6.79 GB processed)
Rowtitlecnt
1Wikipedia:Administrator intervention against vandalism643271
2Wikipedia:Administrators' noticeboard/Incidents419695
3Wikipedia:Sandbox/Archive326337
4Wikipedia:Sandbox257893
5User:Cyde/List of candidates for speedy deletion/Subpage226802
6Wikipedia:Reference desk/Science204469
7Wikipedia:WikiProject Spam/LinkReports191679
8Wikipedia:Reference desk/Miscellaneous186715
9Template talk:Did you know184508
10Wikipedia:Help desk169952
・・・以下略・・・

GROUP EACH BYも便利です。
このパターンに遭遇した事はありませんが、
これも「GROUP EACH BY」無しで回避しようとしたらちょっと面倒そうです。

参考:
Query Reference#GROUP BY clause

◯TIMESTAMPデータ型をネイティブでサポート

「timestamp」という型が追加され、関連した関数がいくつも追加されました。

データをUploadする際のスキーマ定義で
「カラム名:timestamp」
とすることで使用できます。

スキーマ定義はこんな感じ。
name:string, age:integer, birthday:timestamp

実際のデータはこんな感じ。
john,23,1989-10-02 05:23:48
kim,54,1958-06-24T12:18:35.5803
sara,24,1988-08-15T19:06:56.235

これまでBigQueryではTimeZoneの概念が無かった(実質UTCのみ対応)ため、
日本時間で集計しようとした場合に少し面倒でしたが、
これで楽に使えるようになっているといいな、と。

# AppEngineからimportする時はどうなるんでしょ

参考:
Query Reference#Date and time functions
Using TIMESTAMP


◯その他の新機能

他にも以下の機能追加が行われています。

・既存テーブルへのカラム追加
BigQuery APIの「Tables: update」や「Tables: patch」からできるそうです。

・データセットを共有しやすくするためのダイレクトリンクの追加とメール通知
データセットの共有を容易にするためのダイレクトリンクの追加。
データセットを共有した際に相手にメールで通知できるようになった。
とのこと。


◯まとめ

Big JOINの追加はBigQueryにおける本当に大きな進化だと思います。
また、まだあまり調べていませんが、
Timestamp型の追加によってタイムゾーンの扱いも楽になるのではないでしょうか。

あとは「色々なデータソースから簡単にデータをインポートする仕組み」があるといいですね。
AppEngineのDatastoreのデータはバックアップデータを取り込めるけど、
公開されているのはWebのUIだけで、
コマンドラインツールもREST-APIでの取り込み方法も公開されてないので
現状自動化はしづらそうです。
ー`).。oO(Trusted Testerはいつ終るんだろうか・・・実は終わってる?)


◯追記

※2013/03 追記 
「もっとでかいJOINも試してほしい」というリクエストをいただいたので試してみたところ、
予想外の展開となってしまいました。

サンプルとして用意されているテーブルの中から
データ件数が多く、かつJOINの条件にできそうな項目を持つテーブルを探し、
以下のテーブルを使うことにしました。

・wikipediaテーブル・・・313,797,035 (約3億件)
・trigramsテーブル・・・ 68,051,509 (約7000万件)

SELECT
 w.title, w.id, w.timestamp
FROM [publicdata:samples.wikipedia] w,
JOIN EACH [publicdata:samples.trigrams] w2 on w.title=w2.third
ORDER BY w.timestamp
limit 1000;

結果が返ってこないまま、10時間(36,000s)以上ずっとクエリの実行時間の表示がカウントアップされていましたが、

気がつくと
Query Failed
Error: Backend Error
となっていました。

次の日にもう一度試したところ、今度は何度試しても80〜130秒程度で
Query Failed
Error: Resources exceeded during query execution.
という結果が毎回返ってくるようになりました。

当初に試したテスト内容から考えると
BIG JOINによってSmall JOINより大きなサイズのテーブルをJOINできるのは確かなようですが、
もしかしたら完全に無制限とはいかないのかも・・・?



このエントリーをはてなブックマークに追加