2013-01-07 3 views
-4

"고유"는 사용자가 앱을 한 번 이상 다운로드하면 다른 사용자가 앱을 다시 다운로드 할 때까지 다운로드 횟수가 1 (영원히)임을 의미합니다. 예를 들어, 우리는 다음과 같은 사용자 다운로드의 행동을 추적 :App Store에서 모든 앱의 고유 다운로드 횟수를 계산하는 방법은 무엇입니까?

Date  User  App name 
2012-01-01 jack  Angry Birds 
2012-01-01 jack  Angry Birds 
2012-01-02 jack  Angry Birds 
2012-01-02 paul  Angry Birds 
2012-01-02 jack  Snappea 

이 결과를 제공해야합니다 구현하는

Angry Birds  2 
Snappea   1 

간단한 방법을 우리가 을 저장하는 등 HashSet에 같은 데이터 구조를 사용한다는 것입니다 사용자 + 앱 이름을 키로 사용합니다. 그러나 실제로 App Store에는 많은 사용자와 응용 프로그램이 있습니다. 사용자 숫자가 400M이고 650,000 개의 앱이 있다고 가정하면 HashSet의 크기는 최악의 경우 400M * 650K = 260T에 도달합니다. 매일 다운로드 수 을 계산해야한다고 가정합니다..

Google Play hits 600,000 apps, 20 billion total installs에 따르면 앱 스토어의 전체 다운로드 수는 2012 년 6 월까지 입니다. 여전히 큰 숫자입니다.

어떻게 공간을 절약하면서도 빠르게 구현할 수 있습니까? hadoop/hbase를 사용한다면?

+0

SQL에는 DISTINCT 및 COUNT 기능이 있습니다. 뭔가 : (녹슨 SQL에 대한 미안하지만, 아마 작동하지 않지만 생각은 비슷하다.) SELECT app, COUNT (SELECT DISTINCT app, myTable t2 사용자) from myTable t1; – amit

+0

즉, 데이터베이스에 300 억 개의 행을 저장할 필요가 있음을 의미한다. ? 새 레코드를 추가 할 때 성능에 영향을 미칠 것 같아요. –

+0

매일 계산할 것을 요청했습니다. 매일 COUNT 개 작성된 테이블을 업데이트하십시오. 대안은 Map >에 데이터를 유지하는 것입니다. '을 사용하여 고유 한 사용자 수를 얻으십시오. 간단히'map.get (app) .size()'로 – amit

답변

0

데이터베이스 사용 : 테이블이 users입니다. 각 사용자는 다운로드 기록이 있어야합니다. 사용자가 앱을 다운로드하면 다운로드 기록에 추가됩니다. 새로운 앱인 경우 트리거를 사용하여 app 테이블을 업데이트하여 개수를 늘립니다. 좋은 데?

+0

님의 답변을 주셔서 감사합니다. 그러나 사용자의 앱을 다시 다운로드하면 어떻게됩니까? @zenpoy –

+0

사용자 앱 기록에 새 앱인 경우에만 앱의 수를 늘립니다. – zenpoy

관련 문제