次のクエリは、UNION ALL 演算子としてカンマが使える BigQuery の union 機能を使用しています。私たちのサンプル テーブルにおける行はユーザーが発生させたイベントごとに作られるため、各ユーザーがちょうど 1 回ずつ数えられるようにするために EXACT_COUNT_DISTINCT 関数を使っています。
SELECT
user_dim.geo_info.country as country,
EXACT_COUNT_DISTINCT( user_dim.app_info.app_instance_id ) as users
FROM
[firebase-analytics-sample-data:android_dataset.app_events_20160601],
[firebase-analytics-sample-data:ios_dataset.app_events_20160601]
GROUP BY
country
ORDER BY
users DESC
SELECT
user_dim.user_properties.value.value.string_value as language_code,
EXACT_COUNT_DISTINCT(user_dim.app_info.app_instance_id) as users,
FROM
[firebase-analytics-sample-data:android_dataset.app_events_20160601],
[firebase-analytics-sample-data:ios_dataset.app_events_20160601]
WHERE
user_dim.user_properties.key = "language"
GROUP BY
language_code
ORDER BY
users DESC
SELECT
event_dim.name,
COUNT(event_dim.name) as event_count
FROM
[firebase-analytics-sample-data:android_dataset.app_events_20160601]
GROUP BY
event_dim.name
ORDER BY
event_count DESC
他のタイプの値(たとえばアイテムの料金)がイベントと関連づけられている場合は、それをオプションの value パラメータとして渡すと、BigQuery でその値によるフィルタリングが可能です。
SELECT
event_dim.params.value.int_value as virtual_currency_amt,
COUNT(*) as num_times_spent
FROM
[firebase-analytics-sample-data:android_dataset.app_events_20160601]
WHERE
event_dim.name = "spend_virtual_currency"
AND
event_dim.params.key = "value"
GROUP BY
1
ORDER BY
num_times_spent DESC
SELECT
user_dim.geo_info.city,
COUNT(user_dim.geo_info.city) as city_count
FROM
TABLE_DATE_RANGE([firebase-analytics-sample-data:android_dataset.app_events_], DATE_ADD('2016-06-07', -7, 'DAY'), CURRENT_TIMESTAMP()),
TABLE_DATE_RANGE([firebase-analytics-sample-data:ios_dataset.app_events_], DATE_ADD('2016-06-07', -7, 'DAY'), CURRENT_TIMESTAMP())
GROUP BY
user_dim.geo_info.city
ORDER BY
city_count DESC
SELECT
user_dim.app_info.app_platform as appPlatform,
user_dim.device_info.device_category as deviceType,
COUNT(user_dim.device_info.device_category) AS device_type_count FROM
TABLE_DATE_RANGE([firebase-analytics-sample-data:android_dataset.app_events_], DATE_ADD('2016-06-07', -7, 'DAY'), CURRENT_TIMESTAMP()),
TABLE_DATE_RANGE([firebase-analytics-sample-data:ios_dataset.app_events_], DATE_ADD('2016-06-07', -7, 'DAY'), CURRENT_TIMESTAMP())
GROUP BY
1,2
ORDER BY
device_type_count DESC
SELECT
STRFTIME_UTC_USEC(eventTime,"%Y%m%d") as date,
appPlatform,
eventName,
COUNT(*) totalEvents,
EXACT_COUNT_DISTINCT(IF(userId IS NOT NULL, userId, fullVisitorid)) as users
FROM (
SELECT
fullVisitorid,
openTimestamp,
FORMAT_UTC_USEC(openTimestamp) firstOpenedTime,
userIdSet,
MAX(userIdSet) OVER(PARTITION BY fullVisitorid) userId,
appPlatform,
eventTimestamp,
FORMAT_UTC_USEC(eventTimestamp) as eventTime,
eventName
FROM FLATTEN(
(
SELECT
user_dim.app_info.app_instance_id as fullVisitorid,
user_dim.first_open_timestamp_micros as openTimestamp,
user_dim.user_properties.value.value.string_value,
IF(user_dim.user_properties.key = 'user_id',user_dim.user_properties.value.value.string_value, null) as userIdSet,
user_dim.app_info.app_platform as appPlatform,
event_dim.timestamp_micros as eventTimestamp,
event_dim.name AS eventName,
event_dim.params.key,
event_dim.params.value.string_value
FROM
TABLE_DATE_RANGE([firebase-analytics-sample-data:android_dataset.app_events_], DATE_ADD('2016-06-07', -7, 'DAY'), CURRENT_TIMESTAMP()),
TABLE_DATE_RANGE([firebase-analytics-sample-data:ios_dataset.app_events_], DATE_ADD('2016-06-07', -7, 'DAY'), CURRENT_TIMESTAMP())
), user_dim.user_properties)
)
GROUP BY
date, appPlatform, eventName
True Data の業務は、クライアントとなる小売業者(スーパー、ドラッグストア、コンビニエンスストアなど)から預かったポイントカードを保有する消費者の購入情報(ID-POSデータ)を分析し、それに基づいたコンサルティングや、簡単にデータ活用ができるようにするための分析基盤を提供するというもの。2000 年の創業以来、オンプレミスの社内システムでこれを行ってきましたが、年々、膨大になっていくデータの前に、いよいよそれが限界に。これを受け同社顧問・田中覚さんはクラウドを利用したシステムへの移行を検討し始めました。
「True Data が保有する約 5000 万人の、20~30 億件にも及ぶ購買データをより効率的に分析できるようにすること、それが当時の私のミッションでした。その際、最も重視したのがスピードです。これまでのシステムも悪いものではなかったのですが、あまりに扱うデータが大きくなりすぎたため、何をするにも時間がかかってしまっていました。“分析”とは“仮説”と“検証”の繰り返し。ああでもない、こうでもないとトライ&エラーを繰り返していくことでデータを読み解いていきます。この際、システムの応答が遅いというのは大きな足かせになってしまいます。システムを利用する業務メンバーの思考を止めない処理速度を実現する必要がありました」
そこで選ばれたのが、処理速度に定評のあった Google BigQuery。システム開発を担当した株式会社グルーヴノーツからの推薦もあり、多くの選択肢との比較の末、今春から BigQuery を利用した新システムの運用がスタートしました。
ですが、視聴者やファンがリオ オリンピックについてどう感じていたかを定量的に理解できれば、クールではないでしょうか。何百万件ものツイートを読まなくても、私たち Google の機械学習 API を使えば、それが可能です。この投稿では、そうした定量的な理解に向けて、私たちがどのような分析を行ったかをかいつまんで紹介します。
私たちはまず、Twitter Streaming API を使って、#olympics、#Rio2016、#RioOlympics2016 というハッシュタグを使っているツイート(ラベル付けされたリツイートを除く)を集めました。
そのデータが集まったら、私たちはそれらに対して分析サービスの BigQuery を実行し、Natural Language API が特定したすべての形容詞(感情を知るための大きな手がかりです)を抽出して、それらが使われた回数をカウントしました。さらに、データを細分化し、特定のアスリートに対する形容詞を抽出して、それらのアスリートへの直接的な感情を探りました。
Usain Bolt(ウサイン・ボルト)
Simone Biles(シモーネ・バイルズ)
もちろん、絵文字(emoji)入りのツイートもたくさんありました。私たちは、どの絵文字が一番使われているかがわかれば面白いと考えました。Natural Language API は絵文字に対応していますので、私たちがやるべきことは絵文字の画像とUnicode 値を対応づけて、各絵文字が使われた回数をカウントすることだけでした。
私たちの機械学習 API を組み合わせて興味深いインサイトを得る方法には、無限の可能性があります。私たちは自身の実験を通じて、そして世界中の開発者および企業の素晴らしいプロジェクトから学ぶことにより、新しいユースケースを日々楽しく発見しています。
* この投稿は米国時間 9 月 15 日、Google Cloud Platform の Head of Developer Advocacy である Greg Wilson によって投稿されたもの(投稿はこちら)の抄訳です。 - Posted by Greg Wilson, Head of Developer Advocacy, Google Cloud Platform
アナログ情報をデジタル データに変換できるセンサーやアクチュエータは日夜増え続けていますが、データセンターを越えた先にあるそのような機器に IT インフラを接続する機会を提供するのが、IoT(Internet of Things : モノのインターネット)です。そして、そうした価値ある情報のあるべき場所は Google Cloud Platform(GCP)であると、私たち Google は信じています。
This blog post includes forward-looking statements within the meaning of Section 27A of the Securities Act of 1933 and Section 21E of the Securities Exchange Act of 1934. These forward-looking statements generally can be identified by phrases such as Google or management “believes,” “expects,” “anticipates,” “foresees,” “forecasts,” “estimates” or other words or phrases of similar import. Similarly, statements herein that describe the proposed transaction, including its financial impact, and other statements of management’s beliefs, intentions or goals also are forward-looking statements. It is uncertain whether any of the events anticipated by the forward-looking statements will transpire or occur, or if any of them do, what impact they will have on the results of operations and financial condition of the combined companies or the price of Alphabet or Apigee stock. These forward-looking statements involve certain risks and uncertainties that could cause actual results to differ materially from those indicated in such forward-looking statements, including but not limited to the ability of the parties to consummate the proposed transaction and the satisfaction of the conditions precedent to consummation of the proposed transaction, including the ability to secure regulatory approvals at all or in a timely manner; the ability of Google to successfully integrate Apigee’s operations, product lines and technology; the ability of Google to implement its plans, forecasts and other expectations with respect to Apigee’s business after the completion of the transaction and realize additional opportunities for growth and innovation; and the other risks and important factors contained and identified in Alphabet’s filings with the Securities and Exchange Commission (the "SEC"), any of which could cause actual results to differ materially from the forward-looking statements. The forward-looking statements included in this blog post are made only as of the date hereof. Google and Alphabet undertake no obligation to update the forward-looking statements to reflect subsequent events or circumstances.
「とは言えまだ、移行の第一ステップが終わったばかり。本格的な移行はこれからです。現在はもともと使っていたクラウド プラットフォームと Google Cloud Platform の間の通信コストが馬鹿にならない金額になってしまっているので、早急にこれらを Google に移行していく予定です。移行が完了した部分でパフォーマンス、コスト面が大幅改善することが分かっているので、他のところでもそれが起きることを期待しています」(後藤さん)
versionIdフィールドは、各データストア エンティティのグローバル一意識別子(GUID)です。この ID は、エンティティを保存するときに Cloud Datastore によって自動的に割り当てられます。
consistentId は論理エンティティを特定します。これは、私たちがこの API のユーザーに提供できる ID です。1 つの論理エンティティ内のデータストア エンティティは、すべて同じコンシステント ID を持ちます。
私たちは、論理エンティティのコンシステント ID を、チェーンの最初のデータストア エンティティの ID と同じにしました。コンシステント ID はある程度任意に決めることができ、どのような一意識別子を選んでもかまいません。しかし、低レベルの Cloud Datastore API がどのデータストア エンティティにもユニークな ID を割り当てるので、私たちはコンシステント ID として、最初のデータストア エンティティの ID を使うことにしたのです。