如何做到這一點的谷歌應用程序引擎(蟒蛇):獲取不同用戶對谷歌的App Engine
SELECT COUNT(DISTINCT user) FROM event WHERE event_type = "PAGEVIEW"
AND t >= start_time AND t <= end_time
龍版本:
我對此產生事件的用戶Python的谷歌App Engine應用程序,如綜合瀏覽量。我想知道在給定的時間段內有多少獨特用戶生成了綜合瀏覽量事件。我最感興趣的時間是一個星期,並且在給定的一週裏有大約一百萬次這樣的事件。我想在一個cron工作中運行這個。
我的事件實體是這樣的:
class Event(db.Model):
t = db.DateTimeProperty(auto_now_add=True)
user = db.StringProperty(required=True)
event_type = db.StringProperty(required=True)
隨着SQL數據庫,我會做類似
SELECT COUNT(DISTINCT user) FROM event WHERE event_type = "PAGEVIEW"
AND t >= start_time AND t <= end_time
發生首先想到的是讓所有的瀏覽量事件並過濾掉重複的用戶。例如:
query = Event.all()
query.filter("t >=", start_time)
query.filter("t <=", end_time)
usernames = []
for event in query:
usernames.append(event.user)
answer = len(set(usernames))
但是這不起作用,因爲它最多隻能支持1000個事件。接下來的事情發生在我身上的是獲得1000個事件,然後當這些事件用完時獲得下一個千分之一等等。但是這也行不通,因爲經歷了一千次查詢並檢索一百萬個實體將花費超過30秒,這是請求時間限制。
然後我想我應該爲了通過用戶更快地跳過重複。但因爲我已經使用了不平等的「T> = START_TIME和T < = END_TIME」這是不允許的。
似乎很清楚這不能在30秒內完成,因此需要進行分段。但是發現不同的項目似乎並不能很好地分解爲子任務。我能想到的最好的方法是在每個cron jobcall上查找1000個綜合瀏覽量事件,然後從這些事件中獲取不同的用戶名,並將它們放入像Chard這樣的實體中。它可能看起來像
class Chard(db.Model):
usernames = db.StringListProperty(required=True)
因此,每個甜菜將有多達1000個用戶名在裏面,少如果有訪問內容被刪除重複項。約16小時(這是罰款)後,我會所有的chards並可以這樣做:
chards = Chard.all()
all_usernames = set()
for chard in chards:
all_usernames = all_usernames.union(chard.usernames)
answer = len(all_usernames)
好像它可能工作,但幾乎沒有一個漂亮的解決方案。如果有足夠的獨特用戶,這個循環可能需要很長時間。我沒有測試它,希望有人會提出一個更好的建議,所以不是如果這個循環會變得足夠快。
有什麼漂亮地解決我的問題?
當然,這一切的唯一用戶數計數的可以很容易地與谷歌Analytics(分析)來完成,但我構建應用程序的具體指標的儀表板,並打算這是第一很多統計資料。
重要的是能夠有周轉週期,也就是說,從任何給定日期開始的過去七天,還是您可以在日曆周內對它們進行計數? – 2010-01-29 14:29:26
您是否考慮過使用Analytics Feed API從Google Analytics中獲取數據? http://code.google.com/apis/analytics/docs/gdata/gdataReferenceDimensionsMetrics.html – 2010-01-29 14:33:37
我想你想建議添加一個像「calendar_week」字段,所以我可以做SELECT的東西在哪裏calendar_week = some_week?這將是一個解決方案,或許我除了時間戳之外還可以擁有這個解決方案,所以我仍然可以在任何時間之後做任何事情。不過,我很好奇是否還有其他更靈活的解決方案。 第二點,我真的不想讓我的數據脫離分析,因爲我還需要做其他任務,Google Analytics不支持數據存儲中需要的信息。需要設置行爲等直方圖的獨特用戶集合 – Bemmu 2010-01-29 14:44:05