More Related Content Similar to Google fusion tables api v1.0 tips (20) More from Wataru Sato (10) Google fusion tables api v1.0 tips2. 自己紹介
• Wataru Sato
– 本業は通信キャリア研究所向けにソフトウェア
作っています
– 個人的にはAndroid、AWS(SDB)、Fusion Tablesなど
で遊んでいます
• SmartTraining
• ググれカス plug-in for twicca
• 他
• @awwa500
• awwa@gmail.com
2
3. きっかけ
• Fusion Tables APIが新しくなり、乗り換え
てみました
• 乗り換えてみたはいいけど、ハマりま
くってドブ板踏み抜き過ぎて疲れました
• 踏み抜いたドブ板の数を数えてみたら結
構あったので、まとめてみました
3
6. Google Fusion Tables APIとは
• FTのデータにアクセスするためのAPI
• 2つのAPI
– SQL API
• 既にオワコン
• We will now shut down SQL API after January 14, 2013.
– API v1.0
• 今ならこれを使うしかない
• RESTful HTTP経由でSQL的なクエリ操作ができる
• 結果はJSON or CSVで受け取る
6
7. ライブラリ
• FTを使おうと思った時に公開されていたも
のが依存関係とか、使い方覚えるのが面
倒だったので使っていません
• 最近チェックしたらスッキリしてきたか
も
– https://code.google.com/p/google-api-java-
client/wiki/APIs#Fusion_Tables_API
• もしかしたら、コレを使っていればドブ
板踏み破る数は減っていたかも
• 是非使ってみて下さい
7
8. 基本
• Google APIs consoleでサービス有効化
• OAuth 2.0
• HTTPリクエスト
• レスポンスパース
• 詳しくは
– https://developers.google.com/fusiontables/docs/
v1/using
8
9. OAuth2.0
• 通常は、普通にOAuth2すればいい
• Androidの場合、AccountManager経由がセキュリティ的
に好ましい
– 琴線探査:AndroidのAccountManager経由でGoogleの
OAuth2認証を行うには?(外部ライブラリ完全非依存版)
• http://kinsentansa.blogspot.jp/2012/08/androidaccountmanagergoog
leoauth2.html
• AndroidでWebView経由で行うのは好ましくない
– Shogo’s Blog:OAuthの認証にWebViewを使うのはやめよう
• http://shogo82148.github.com/blog/2012/11/24/no-more-webview/
• この記事はTwitterのOauthに関して書かれているが、WebViewの
脆弱性に関しては同じ事
9
12. レコードCRUD
CRUD 手法 詳細
Create Insert row 1クエリ1レコード挿入
クエリを”;”で繋げて1リクエストに複数クエリ送信可
戻り値でROWIDを得ることができる
Import rows POSTのBodyにCSVを突っ込んで大量レコード挿入可
戻り値でROWIDを得ることができない
Select Select rows 作成したColumnの他、ROWIDを取得することができ
る
Update Update row ROWID指定するか、無指定で全レコード対象
任意の条件を指定することはできない
Delete Delete row ROWID指定するか、無指定で全レコード対象
任意の条件を指定することはできない
12
13. 大量レコード挿入戦略~Insert row
~
• Insert rowでは、1リクエストあたり500
Insertまでいける、とドキュメントに書い
てある
– https://developers.google.com/fusiontables/docs/
v1/using#insertRow
– しかし、sqlパラメータはQueryString
– 実際にはURL長の制限を受ける
• ヾ(*`Д´*)ノ“
13
14. 大量レコード挿入戦略~Import rows
~
• Import rowsなら1リクエストで100MBまでの
データを挿入できる
• しかし、戻り値でROWIDは取得できない
• ROWIDが欲しければ、Import rows後、Select
する必要がある
• しかし、500レコード以上をImport rowsした
場合、すぐにSelectしてもROWIDが取得でき
ない場合がある
• どうやらImport rows後のレコード反映は、
500レコードずつ分割されて非同期で実行さ
れている模様
14
15. 大量レコード挿入戦略~Import rows
~
• 大量レコードImport時の雰囲気
Client FT BackEnd
Import rows (over 500 rows)
Insert rows(500)
NumRowsReceived=2500
Select Insert rows(500)
Insert rows(500) 反映に時間
全レコード取れない!
がかかる
Insert rows(500)
Insert rows(500)
15
16. 大量レコード挿入戦略~Import rows
~
• 期待したレコード数になるまでポーリン
グ Client FT BackEnd
Import rows (over 500 rows)
Insert rows(500)
NumRowsReceived=2500
Select count() Insert rows(500)
Insert rows(500) 反映に時間
1000
がかかる
Select count() Insert rows(500)
2000 Insert rows(500)
Select count()
2500
Select
16
ROWID
18. 大量レコード挿入戦略~Import rows
~
• まとめ
– アクセス頻度に応じた作戦をとること
レコードアクセス頻 方法
度
高い Import rows後、速やかに全ROWIDを取得してローカルに
記憶しておき、即更新処理を可能にしておく
低い Import rows後、ROWIDは必要になったタイミングで個別
にSelect後、目的の更新処理を実行する
取得したROWIDはキャッシュしておくと少しは良い
18
19. レコード更新(Update, Delete)時
注意
• ROWID指定した場合
– レスポンスのaffectedRowsには影響を受けたレ
コード数が整数で返ってくる
• ROWID指定しない場合
– レスポンスのaffectedRowsに”all rows”という文
字列が返ってくる
_人人人人人人人人_
>文字列が返ってくる<
 ̄^Y^Y^Y^Y^Y^Y^Y^Y ̄ 19
20. ROWIDに関する注意
• Insert rowした場合のROWID
– 割り当てられるROWIDは昇順とは限らない
• Order by無指定時のソート順
– ROWIDの昇順でソートされて返ってくる
• Order byにROWIDを指定すると503
– 指定してはいけない
• ROWID = 0でSelectすると503
– 指定してはいけない
20
21. テーブル間の外部参照
• そんな機能はない
• あるわけがない
• どうしてもやりたければ
– A案)子テーブルに親テーブルレコードのROWID
を格納するColumnを設ける
– B案)親テーブルのレコード毎に子テーブルを分
けて、親テーブルに子テーブルのtableIdを格納す
るColumnを設ける
• 無論、関連情報は自分で更新する、制約がは
れるわけではない
21
23. テーブル間の外部参照
• B案)親テーブルのレコード毎に子テーブ
ルを分けて、親テーブルに子テーブルの
tableIdを格納するColumnを設ける
親テーブル
ROWID CHILD_TABLE_ID
子テーブル(tableId=XXX)
1 XXX
2 YYY ROWID
1
子テーブル(tableId=YYY)
2
ROWID
1
大量なテーブル生成は大量なImportを必要とする 2
503発生の原因になりやすいので注意する 23
25. HTTP 503との闘い
• HTTP 503:Service Unavailable
– 裏でナニかが起きた
– ナニ
• 高頻度のアクセスによるブロック
• Select rowでROWIDでorder by
• Select rowでROWID = 0
• Fusion Tables自体の不具合(たぶん)
• など
25
26. アクセス制限
• Google APIs console
• 制限はこれだけではない
– 上限に関して明確には規定されていない
• 問合せても回答がもらえない
– 特にImport rowsで発生しやすい
• 例)Import rowsをスリープなしで18回繰り返すと発生
– 復旧
• まる1日制限されたり、数分で復旧したり、とにかくよくわ
からない
– 影響範囲
• ユーザ単位
26