2017-06-02 94 views
4

我们计划使用Keen作为我们的跟踪核心,但是结合请求和提取数据对我们来说是一件大事。如何识别X次执行操作的用户? [keen-io]

如果我们有例如命名为pageviews一个集合,与用户作为它的一个属性(像这样:{"name": "pageviews", "properties":{"user":{"id":"4242"},"url":"https://keen.io/"}}),以及另一个集合名为purchases具有相同user属性里面:

  1. 哪有我们获得了访问过至少3次一个网址并已完成另一个事件“购买”的唯一用户数量?

  2. 我们如何提取这些人?是否有可能通过Amazon S3进行数据复制? (与亚马逊雅典娜?)。 “提取”功能似乎不能满足我们的提取问题,因为我们不能应用“group by”语句,并且我们不能将多个事件组合起来(我错了吗?)。

我们的目标是使用基恩不仅作为统计分析仪,而且作为我们分割/提取使用的强大数据支持。

回答

4

这里有多种选择来解决这个问题:

解决方案1:你们用设置一个简单的标准是什么? Keen的funnel分析类型具有自然语法,用于识别已完成(或未完成)操作A,B,C等的特定用户清单。然而,它不具有基于快速filter次数该操作已完成。这一部分标准有多重要?你能代替确定谁拥有用户:

程序步骤

  1. 观看/keen.io/
  2. /keen.io/products
  3. 进行购买

这种简化会瞬间让你的问题交代在一个funnel query

解决方案2:两步查询过程。 在这个解决方案中,我们将运行两个单独的查询来得出结果。首先,我们将使用select_unique来识别执行了更为罕见的操作(购买)的用户。在下一个查询中,我们将count该特定页面的所有视图和group_byuser.id以计算每个用户查看该页面的次数。我们将使用查询1的结果作为查询2中的过滤器的一部分,以便我们只查询已完成购买的相关用户。然后,我们可以挑选出哪些用户已购买并查看了该页面3次或更多次。

var client = new Keen({ 
 
    projectId: "PROJECT_ID", 
 
    readKey: "READ_KEY" 
 
}); 
 

 
var usersWhoPurchased = [] 
 

 
// Query 1 
 
var usersWhoPurchasedQuery = new Keen.Query("select_unique", { 
 
    event_collection: "purchases", 
 
    target_property: "user.id", 
 
    timeframe: "this_7_days" 
 
}); 
 

 
// Get Query 1 Results 
 
client.run(usersWhoPurchasedQuery, function(err, response){ 
 
    usersWhoPurchased = response['result'] 
 
}); 
 

 

 
// Query 2 
 
var activityCountsByUserQuery = new Keen.Query("count", { 
 
    event_collection: "pageviews", 
 
    group_by: "user.id", 
 
    timeframe: "this_7_days", 
 
    filters: [ 
 
    \t { 
 
    \t property_name: "url", 
 
    \t operator: "eq", 
 
    \t property_value: https://keen.io/ 
 
    \t }, 
 
    \t { 
 
    \t property_name: "user.id", 
 
    \t operator: "in", 
 
    \t property_value: usersWhoPurchased 
 
    \t } 
 
    ] 
 
}); 
 
    
 
// Get Query 2 Results 
 
client.run(activityCountsByUserQuery, function(err, response){ 
 
    console.log(response) 
 
    var countsByUser = response['result'] 
 
}); 
 

 

 
// countsByUser = [ 
 
// { 
 
//  "user.id": "A", 
 
//  "result": 1 
 
// }, 
 
// { 
 
//  "user.id": "B", 
 
//  "result": 0 
 
// }, 
 
// { 
 
//  "user.id": "C", 
 
//  "result": 3 
 
// } 
 
// ] 
 
// Sort countsByUser to identfy those with >3

这种方法,您缩放,并开始从最大用户数您可以在一个过滤器(数百或数千根据ID的长度)有一些注意事项。他们可以分解并分批查询。

解决方案3:包括事件计数。 这种方法在所有情况下都不起作用,但是当它出现时,它可以非常强大和优雅。这个想法是在客户端运行计数,并将它们作为用户属性包含在事件中。例如,在你的网页浏览事件的用户对象可能包含如下属性:

{ 
    "collection_name":"pageviews", 
    "properties":{ 
     "user":{ 
     "id":"4242" 
     }, 
     "url":"https://keen.io/", 
     "product_views_this_session":4 
    } 
} 

有了这样的数据,你可以再次使用一个简单的漏斗过滤,以确定谁符合条件

漏斗用户步骤

  1. 浏览过的页面 'https://keen.io',其中product_views_this_sessiongt4
  2. 进行购买

解决方案4:使用S3流+ AWS拉姆达+ RDS或DynamoDB

如果你还没有拥有它开启实现柜台,使您所有的原始数据热衷到Amazon S3的流。一旦它在那里,您可以对传入的数据和静止的数据执行各种附加步骤。

你的过程可能是这样的:

  1. 打开Keen IO Streaming to S3
  2. 写一个AWS Lambda job一种审查输入数据和
  3. 计数每个用户多少次每个动作
  4. 中查找RDS表中的每个用户
  5. 递增该用户的计数和该操作
  6. 在同一个Lambda作业中,使用新属性将事件重新发送回新的集合中的Keen,如下所示。

新事件:

{ 
    "collection_name":"user_product_view_enriched", 
    "properties":{ 
     "user":{ 
     "id":"4242" 
     }, 
     "url":"https://store.io/productA45", 
     "view_history":{ 
     "product":"A45", 
     "lifetime_views":5, 
     "counting_since":"<timestamp>" 
     } 
    } 
} 

把数据回热衷于这种格式允许你使用标准漏斗在方案3中描述:

程序步骤

  1. 用户产品“A45”和lifetime_views>
  2. 中的事件发生在 user_product_view_enriched
  3. 进行购买的用户

该方法的局限性在于,您不能随意更改计数器“启动”的时间和方式。例如,也许你以后决定,你只想在过去的三周而不是一生中计算观点。你必须查询S3中的原始数据才能得到这样的新数据,但是你已经有了这些数据,所以并不是那么重要。

解决方案5:使用EMR和/或雅典娜

撰写定期批处理作业来查询您的原始S3数据,并确定你有兴趣的用户原始S3数据实现更复杂的查询有这里有各种各样的选择,我不是专家,但我知道是可能的。

+0

谢谢你的完整答案! 第一个和第三个解决方案不适用:第一个解决方案是有限的,因为过滤用户的行为次数标准是我们想要构建的营销项目中的主要标准之一。 第三个涉及到做一些服务器端逻辑,但由于我们将构建我们的项目,它将完全在客户端。 解决方案2是完美的,除了限制。我们肯定会在过滤器中拥有超过数百/数千人。 S3复制是否有机会拯救我们? – Norzn

+0

是的,让我给上面添加一个解决方案4,并概述另一个涉及S3中数据的选项。 –