5

我们计划使用 Keen 作为我们的跟踪核心,但是结合请求和提取数据对我们来说是一件大事。

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

  1. 我们如何获得访问过一个 url 至少 3 次并完成另一个事件“购买”的唯一用户的数量?

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

我们的目标是不仅将 Keen 用作统计分析器,而且将其用作对我们的分割/提取使用的强大数据支持。

4

1 回答 1

5

以下是解决此问题的多种选择:

解决方案 1:您可以使用更简单的标准集吗?Keen 的漏斗分析类型具有一种自然的语法,用于识别已完成(或未完成)操作 A、B、C 等的用户的特定清单。但是,它不能根据数量快速过滤动作已经完成的次数。您的标准的这一部分有多重要?您能否改为识别具有以下内容的用户:

漏斗步骤

  1. 查看/keen.io/
  2. 查看/keen.io/products
  3. 购买了

这种简化会立即使您的问题在单个漏斗查询中得到解答。

解决方案2:两步查询过程。在这个解决方案中,我们将运行两个单独的查询来获得结果。首先,我们将使用select_unique来识别执行了较为罕见的操作(购买)的用户。在下一个查询中,我们将统计该特定页面的所有查看次数,并使用group_by user.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: [
  	{
  	  property_name: "url",
  	  operator: "eq",
  	  property_value: https://keen.io/
  	},
  	{
  	  property_name: "user.id",
  	  operator: "in",
  	  property_value: usersWhoPurchased
  	}
  ]
});
    
// 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_session gt 4
  2. 购买了

解决方案 4:使用 S3 Streaming + AWS Lambda + RDS 或 DynamoDB 实施计数器

如果您尚未打开它,请启用将所有原始 Keen 数据流式传输到 Amazon S3。一旦它在那里,您就可以对传入的数据和静态数据执行各种额外的步骤。

你的过程可能是这样的:

  1. 开启Keen IO Streaming to S3
  2. 编写一个AWS Lambda 作业来检查传入的数据并
  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>"
      }
   }
}

以这种格式将数据放回 Keen 允许您使用标准漏斗,如解决方案 3 中所述:

漏斗步骤

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

此方法的限制是您不能任意更改计数器“启动”的时间和方式。例如,也许您稍后决定只计算过去 3 周内的观看次数,而不是生命周期内的观看次数。您必须在 S3 中查询原始数据才能得出这样的新计数,但您已经拥有数据,所以这不是什么大问题。

解决方案 5:使用 EMR 和/或 Athena 对原始 S3 数据实施更复杂的查询

编写一个常规的批处理作业来查询您的原始 S3 数据并确定您感兴趣的用户。这里有多种选择,我不是专家,但我知道是可能的。

于 2017-06-05T17:24:37.550 回答