2

ハッシュキー/プライマリキーが "UserID"で電子メールで構成される "Users"というAWS DynamoDBテーブルがあります。それには、最初に「毎日のポイント」と呼ばれる2つの属性と、2番目の「TimeSpendInTheApp」という属性があります。今私はクエリを実行するか、テーブル上でスキャンする必要があります、それは私に最高のポイントを持っているトップ50ユーザーとアプリで最も多くの時間を過ごしたトップ50ユーザーを与えます。このクエリはcron aws lambdaによって1日1回だけ実行されます。私はこのクエリまたはスキャンのための最良のソリューションを見つけることを試みています。私にとって、コストはスピード/効率よりも重要です。セカンダリグローバルインデックスまたはポイント上のローカルインデックスを維持することは、私が避けたいそれらのインデックスに対してReadユニットとWriteユニットを割り当てる必要があるため、コストのかかる操作になる可能性があります。 「ユーザー」テーブルは最大10万〜15万レコードあり、平均して50,000レコードになります。私の最善の選択肢は何ですか?提案してください。DynamDBテーブルのスキャンまたはセカンダリグローバルインデックスまたはローカルインデックスのクエリ

私は考えていますが、最初の選択肢は、このスキャン後に50個以上のレコードが見つかった場合は、フィルタ式で特定のポイント(たとえば5000)値を入力して上位50レコードを取得します。このスキャンで結果が返ってこない場合や、結果が非​​常に少ない場合は、Filter Expression値(たとえば3000)を減らしてから、同じスキャン操作を再度実行します。フィルタ式の値(たとえば2500)が5000以上のレコードを返す場合は、フィルタ式の値を減らします。これも可能ですか?ページネーションも処理する必要があると思います。 50,000レコードのテーブルをスキャンすることをお勧めしますか?

アドバイスやご提案が役に立ちます。前もって感謝します。

答えて

0

まず、上記のユースケースのインデックスを作成しても、集計やソートの解決策がないため、プロセスが単純化されるわけではありません。

データをHIVEにエクスポートして、結果を判断するためのコードを書くのではなく、クエリを実行して、特に1日に1回しか実行されないバッチになるようにします。

以下のような何か: -

ハイブテーブルを作成します -

CREATE EXTERNAL TABLE hive_users(userId string, dailyPoints bigint, timeSpendInTheApp bigint) 
STORED BY 'org.apache.hadoop.hive.dynamodb.DynamoDBStorageHandler' 
TBLPROPERTIES ("dynamodb.table.name" = "Users", 
"dynamodb.column.mapping" = "userId:UserID,dailyPoints:Daily_Points,timeSpendInTheApp:TimeSpendInTheApp"); 

クエリ: -

SELECT dailyPoints, userId from hive_users sort by dailyPoints desc; 
SELECT timeSpendInTheApp, userId from hive_users sort by timeSpendInTheApp desc; 

Hive Reference

関連する問題