2016-12-14 12 views
0

は、私がこれに似たデータセットを持っている:キーでグループ化されたタイムスタンプで最新のレコードを返す方法は?

{"user":333,"product":943, "rating":2.025743791177902, "timestamp":1481675659} 
{"user":333,"product":3074,"rating":2.1070657532324493,"timestamp":1481675178} 
{"user":333,"product":3074,"rating":2.108323259636257, "timestamp":1481673546} 
{"user":333,"product":943, "rating":2.0211849667268353,"timestamp":1481675178} 
{"user":333,"product":943, "rating":2.041045323231024, "timestamp":1481673546} 
{"user":333,"product":119, "rating":2.1832303461543163,"timestamp":1481675659} 
{"user":333,"product":119, "rating":2.1937538029700203,"timestamp":1481673546} 
{"user":111,"product":123, ... 

私は、ユーザー(例えば333)のためのすべてのレコードを照会するが、唯一の各製品の最新のタイムスタンプを返すようにしたいと思います。例えば。上記のデータに基づいて、クエリが返します:

SELECT * FROM recommendations L 
LEFT JOIN recommendations R ON 
      L.user = R.user AND 
      L.product = R.product AND 
      L.timestamp < r.timestamp 
WHERE isnull(r.user) and isnull(r.product) 

は/インデックスを減らすマップで、このことが可能です:

{"user":333,"product":119, "rating":2.1832303461543163,"timestamp":1481675659}  
{"user":333,"product":3074,"rating":2.1070657532324493,"timestamp":1481675178} 
{"user":333,"product":943, "rating":2.025743791177902, "timestamp":1481675659} 

同等のSQLクエリは、このような「何か」を見てでしょうか?もしそうなら、どうですか?そうでない場合は、lucene indexなどの代替アプローチがありますか?

理想的には、評価値で並べ替えることもできます。

答えて

1

Cloudant/CouchDB MapReduceは複合キーの集計/合計/統計情報を生成できます。

  • 番号エントリは、ユーザー&製品
  • ユーザー&製品

でグループ化された平均評価によってグループ化されたが、それは、ユーザ&製品でグループ化された「最新の格付けを」あなたを返すことはできません。

Luceneベースのインデックスはあまり役に立ちません。それは、時間窓内のデータの選択を可能にする。 「ユーザーZに属するタイムスタンプXとタイムスタンプYの間のユーザー評価を取得しますが、Luceneベースのインデックスには集計関数がないため、アプリケーションで作業する必要があります。

もう1つの解決策は、データをDashDBのようなデータウェアハウジングソリューションにエクスポートし、その集約SQLクエリをそこで実行することです。