Treasure Dataで大規模なマスタデータを扱う際にはtimeカラムインデックスを活用しよう


DACではTreasure Dataを利用して各種データの蓄積や集計を行っています。Treasure Dataは時系列のデータを扱うのに特にすぐれたアーキテクチャなのですが、セグメントIDとユーザーIDの組み合わせといった大量のマスタデータを利用した計算にも利用することもできます。そのような場合にtimeカラムインデックスを活用してマスタデータを高速に抽出する方法について解説します。

Treasure Dataでは時系列のデータを効率よくあつかうため、timeカラムが固定インデックスとなっており、3600秒(1時間)ごとのパーティショニングに分けてインポートされます。この性質を利用して、時系列で格納する必要のないデータについては「セグメントID * 3600」「カテゴリID * 3600」のようにマスタのキー値を元に作成した時間を設定することで値が高速に取得できるようになります。

検証のためにtimeカラムをセグメントIDとして設定したテーブルを作成します。テーブル作成の元ネタはセグメントとユーザーのM:N対応を縦持ちで持つテストデータで、総行数は約8億行あります。

指定したふたつのセグメント同士の重複ユーザー数を抽出してみましょう。

Presto計算ログ(1分36秒)

指定のセグメントだけを取りたいのにテーブルに対するフルスキャンが走っており、ピークメモリ使用量も大きくなっています。これに対してtimeカラムでセグメントIDを指定してみます。

Presto計算ログ(20秒)

実行時間が20%程度になり、ピークメモリ使用量も10%程度に削減されています。timeカラムインデックスを利用しているため、セグメントIDが「1975-11-16 06:00:00 UTC」という扱いになっています。timeカラムインデックスを利用した格納・取得方法はHiveでもPrestoでも効きますので、時系列に格納する必要性のないデータについては、マスターデータのキーをtimeとして指定しながら格納することで高速な抽出ができるようになります。もちろん結果値は同等です。

注意点としてはtimeはBigInteger型であり、日付型としても扱われることから1億年と2000年前から検索するといった事はできません。このような値をtime値を格納すると正常にパーティショニングされず、timeを利用していないクエリについても正常に取得できなくなる可能性があります。このため大きなID番号を取り扱う際には「time * 3600」ではなく「time * 360」としたうえでセグメントIDとの複合キーにするなど、適切な範囲で散らばるようにIDをグルーピングすべきです。

以上、Treasure Dataで大規模なマスタデータを扱う際にはtimeカラムインデックスが利用できるというTIPSでした。


DACエンジニア採用情報

  関連記事

image1
トレジャーデータの新機能「Data Connector」でクライアントレスなビッグデータ連携を実現する

トレジャーデータは、スキーマレスな大量のデータ(ビッグデータ)をパブリッククラウド上に保管して集計や抽出をするためのサービスなのですが、他システムからの連携データをトレジャーデータのテーブルに格納するまでが一苦労でした。 他システムとの外部連携を行う場合、一般的にローカルサーバー内のストレージを外部 …

6914441342_605f947885
Treasure Dataの新機能(Data Tank)をAudienceOneのレポート機能で利用した話

Data Tankとは? Treasure Dataの新機能でTreasure Dataのプラットフォーム上に構築されたデータマートです。 Tableau等のBIツールとの接続を想定されており、AWSでいうところのRedshift的なものだと考えるとわかりやすいかと。 Data TankはPostg …

bigdata
HyperLoglogでcount distinctを速くする

こんにちは。俺やで。 HyperLoglogについて書きます。おもしろいです。名前が。 ■1. HyperLoglogとは? count distinctを速くするアルゴリズム 以前、Minhashについて書きました。 (Treasure Dataさんのブログにも載せていただきました。ありがとうござ …

no image
Treasure Dataで長期間の集計

プラットフォーム・ワン T氏です。プラットフォーム・ワンでは、DSPのMarketOneとSSPのYIELD ONE提供しています。 MarketOneやYIELD ONEのログを調査する場合にTreasure Dataを使うことがあります。Treasure Dataでは大量のデータに対してHive …

heatmap
巨大データベースのスケールアップと引越作業

はじめに ビッグデータ解析部でオーディエンスデータ解析基盤の開発、運用を担当している Mike です。 弊社ではインターネット広告配信ログをはじめとする「ビッグデータ」と呼ぶにふさわしいデータボリュームを扱うオーディエンスデータ解析基盤を構築しています。今秋、そのうちの1構成要素である、データサイズ …

toadstool
【Hivemall入門】RandomForestで毒キノコ推定モデルを作る

こんにちは。俺やで。 今回も前回から間が空いてしましたが、ビッグデータに対応したHiveで使える機械学習ライブラリ、 Hivemallの使い方について、書かせていただければと思います。 なお今回はQiitaのTreasure Data / Advent Calender 2015の12/3日分として …

l_077
fastavroとjqでAVRO形式のファイルからデータを取得しよう

AVRO形式のファイルを取り扱いたい AVROとはApacheプロジェクトのひとつとして開発されているデータ交換形式です。 コンパクトなバイナリで高速なシリアライズ・デシリアライズが行えるため、サーバーログなどに利用されています。 弊社内での一部システムのログデータにも利用されているのですが、専用の …

data-tenki
気象予報士とビッグデータ解析の意外な関係

DACから気象予報士が誕生しました ビッグデータ解析部のMikeです。 2015年1月の気象予報士試験に合格し、めでたく4月からアドテク業界ただ一人(本当?)の気象予報士となりました 。 そんなわけで、今回は気象予報士とビッグデータ解析の関係についてお話したいと思います。 なぜ気象予報士を目指したか …

Screen Shot 2014-11-17 at 9.33.19 PM
Amazon ElastiCache/Redisのパフォーマンス確認

はじめに こんにちは、AudienceOne開発部です。AudienceOne開発部ではいわゆるビッグデータと呼ばれる大量のデータをアドホックあるいは定常的に日々ETLだの集合演算だのをする一方で、様々な大規模データ処理ソリューションを継続的に検証しております。 本記事は、その中でもユーザが保持して …

11396380473_26f323b1e4_z
Google BigQuery / Tableauを使ってみた

TableauからGoogle BigQueryへ接続してみました。 弊社で利用しているTreasureDataからデータ出力してBigQueryへロード、Tableauから接続まで実際に行った手順について記載します。 TreasureDataからAmazonS3へデータ出力 まず、データが蓄積され …