2010-01-29 58 views
4

如何做到這一點的谷歌應用程序引擎(蟒蛇):獲取不同用戶對谷歌的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(分析)來完成,但我構建應用程序的具體指標的儀表板,並打算這是第一很多統計資料。

+0

重要的是能夠有周轉週期,也就是說,從任何給定日期開始的過去七天,還是您可以在日曆周內對它們進行計數? – 2010-01-29 14:29:26

+0

您是否考慮過使用Analytics Feed API從Google Analytics中獲取數據? http://code.google.com/apis/analytics/docs/gdata/gdataReferenceDimensionsMetrics.html – 2010-01-29 14:33:37

+0

我想你想建議添加一個像「calendar_week」字段,所以我可以做SELECT的東西在哪裏calendar_week = some_week?這將是一個解決方案,或許我除了時間戳之外還可以擁有這個解決方案,所以我仍然可以在任何時間之後做任何事情。不過,我很好奇是否還有其他更靈活的解決方案。 第二點,我真的不想讓我的數據脫離分析,因爲我還需要做其他任務,Google Analytics不支持數據存儲中需要的信息。需要設置行爲等直方圖的獨特用戶集合 – Bemmu 2010-01-29 14:44:05

回答

1

這是一個可行的解決方案。它依賴於使用memcache的程度,所以總有可能您的數據以不可預知的方式被驅逐出去。 注意事項。

您將有一個名爲的memcache變量unique_visits_today或類似的東西。每當用戶有一天的第一個瀏覽量時,您就可以使用.incr()函數來增加該計數器。

確定這是用戶的第一次訪問是通過查看附加到用戶的last_activity_day字段來完成的。當用戶訪問時,您看看該字段,如果是昨天,則將其更新至今天並增加您的memcache計數器。

每天午夜,cron作業會將memcache計數器中的當前值寫入數據存儲,同時將計數器設置爲零。你將有一個這樣的模式:

class UniqueVisitsRecord(db.Model): 
    # be careful setting date correctly if processing at midnight 
    activity_date = db.DateProperty() 
    event_count = IntegerProperty() 

然後,您可以簡單,輕鬆,快速地獲得所有匹配任何日期範圍的UnqiueVisitsRecords的,並在其EVENT_COUNT領域加起來的數字。

+1

這依賴於您在整個一天內留在memcache中的價值。memcache是​​一個緩存,不是可靠的存儲;這只是一個很好的答案,如果你很高興總是失去你的點數。 – geoffspear 2010-03-30 12:45:09

1

谷歌App Engine和更具體的GQL不支持DISTINCT功能。

但是您可以使用Python的set功能,如this博客中所述以及this SO問題。

+0

謝謝。我意識到這個問題和博客帖子,但是由於任務的規模,他們不適用於這種情況。 – Bemmu 2010-01-29 14:40:40