2017-05-24 41 views
6

dynamodbとのアグリゲーションはどのように達成されますか? Mongodbとcouchbaseはmap reduceをサポートしています。Dynamodbを使った基本的な集計方法は?

ユーザーが記事を投稿できる技術ブログを構築しているとします。記事にタグを付けることができます。我々は、現在のユーザーのタグと、それぞれのカウントに表示するユーザーインターフェイスで

user 
{ 
    id : 1235, 
    name : "John", 
    ... 
} 

article 
{ 
    id : 789, 
    title: "dynamodb use cases", 
    author : 12345 //userid 
    tags : ["dynamodb","aws","nosql","document database"] 
} 

以下の集計を達成するにはどうすればよいですか?

{ 
    userid : 12, 
    tag_stats:{ 
     "dynamodb" : 3, 
     "nosql" : 8 
    } 
} 

このデータは残りのAPIを介して提供され、頻繁に呼び出されます。この情報は、アプリのメインページに表示されます。

  • 私はすべてのドキュメントを抽出し、アプリケーションレベルで集計すると思います。しかし私は私の読書容量単位が使い果たされると感じます
  • EMR、redshift、bigquery、aws lambdaのようなツールを使うことができます。しかし、私はこれらがデータウェアハウスの目的だと思う。

私は他のより良い方法を知りたいと思います。 コストや応答時間を考慮してダイナモをプライマリデータストアとして選択したような動的な単純なクエリを人々はどのように達成していますか?

答えて

4

ロングストーリー:Dynamoはこれをサポートしていません。このユースケースのためのビルドではありません。これは、低遅延で素早くデータにアクセスするためのものです。これは単に集約機能をサポートしていません。

次の3つの主要なオプションがあります。RedshiftまたはEMR Hive

  • エクスポートDynamoDBのデータを。その後、失効したデータに対してSQLクエリを実行することができます。このアプローチの利点は、RCUを1回だけ消費することですが、古いデータを使用することになります。

  • DynamoDB connectorをHiveに使用し、DynamoDBに直接クエリします。この場合も、任意のSQLクエリを書き込むことができますが、この場合、DynamoDBのデータに直接アクセスします。欠点は、実行するすべてのクエリで読み取り容量が消費されることです。

  • DynamoDB streamsを使用して別のテーブルに集約データを更新します。たとえば、テーブルUserIdをパーティションキーとして、タグとカウントを属性として持つネストマップを作成できます。元のデータのすべての更新時に、DynamoDBストリームはラムダ関数またはホスト上のいくつかのコードを実行して集約テーブルを更新します。これは最もコスト効率の良い方法ですが、新しいクエリごとに追加のコードを実装する必要があります。

もちろん、アプリケーションレベルでデータを抽出して集計することはできますが、それを行うことはお勧めできません。小規模なテーブルを用意していない場合は、プロビジョニングされた容量の一部(たとえば、集計のためにRCUの20%を消費し、100%ではない)を使用して、絞り込みについて考える必要があります。 。

RedshiftとHiveはどちらもこれを行う方法を既に知っています。 Redshiftはクエリ実行時に複数のワーカーノードに依存しますが、HiveはMap-Reduceの上に基づいています。また、RedshiftとHiveの両方で、RCUスループットの定義済みのパーセンテージを使用できます。

関連する問題