Nor*_*rzn 5 data-modeling keen-io
我们计划使用Keen作为我们的跟踪核心,但结合请求和提取数据对我们来说是一件大事.
例如,如果我们有一个名为的集合pageviews,其中一个用户作为它的属性(如:){"name": "pageviews", "properties":{"user":{"id":"4242"},"url":"https://keen.io/"}},另一个集合内部purchases具有相同的user属性:
我们如何才能获得至少访问过3次网址且已完成另一项"购买"活动的唯一身份用户数量?
我们怎样才能提取这些人?是否可以使用Amazon S3数据复制执行此操作?(与亚马逊雅典娜?)."提取"功能似乎不能满足我们的提取问题,因为我们不能应用"分组依据"语句,我们不能将多个事件组合起来进行提取(我错了吗?).
我们的目标是不仅将Keen用作统计分析器,还将其作为分段/提取使用的强大数据支持.
以下是解决此问题的各种选项:
解决方案1:您能使用更简单的标准集吗?Keen的漏斗分析类型具有自然语法,用于识别已完成(或未完成)操作A,B,C等的特定用户库存.但是,它不具备基于该数字快速过滤的能力.次行动已经完成.这部分标准有多重要?您可以识别具有以下内容的用户:
漏斗步骤
/keen.io/和/keen.io/products和这种简化会立即使您的问题在单个漏斗查询中得到回答.
解决方案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 >3Run Code Online (Sandbox Code Playgroud)
在缩放时,此方法有一些注意事项,并开始最大化可包含在过滤器中的用户数(数百或数千,具体取决于ID长度).它们可以分批分解和查询.
解决方案3:包括事件计数.这种方法并不适用于所有情况,但是当它发挥作用时,它可以非常强大和优雅.我们的想法是在客户端运行计数,并将它们作为事件的用户属性包含在内.例如,您的网页浏览事件中的用户对象可能包含以下属性:
{
"collection_name":"pageviews",
"properties":{
"user":{
"id":"4242"
},
"url":"https://keen.io/",
"product_views_this_session":4
}
}
Run Code Online (Sandbox Code Playgroud)
使用这种数据,您可以再次使用带过滤器的简单渠道来识别符合条件的用户
漏斗步骤
product_views_this_session gt 4解决方案4:使用S3 Streaming + AWS Lambda + RDS或DynamoDB实现计数器
如果您尚未启用它,请启用所有原始Keen数据到Amazon S3的流式传输.一旦它存在,您可以对传入的数据和静态数据执行各种额外的步骤.
你的过程可能是这样的:
新事件:
{
"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>"
}
}
}
Run Code Online (Sandbox Code Playgroud)
以这种格式将数据重新输入Keen允许您使用解决方案3中所述的标准漏斗:
漏斗步骤
user_product_view_enriched使用产品"A45"和lifetime_views> X的事件的用户对此方法的限制是您不能随意更改计数器"启动"的时间和方式.例如,您可能稍后决定只想在过去3周内计算视图而不是终生.您必须在S3中查询原始数据以获得类似的新计数,但您已经拥有了数据,因此它不是那么重要的交易.
解决方案5:使用EMR和/或Athena对原始S3数据实施更复杂的查询
编写一个常规批处理作业来查询原始S3数据并识别您感兴趣的用户.这里有各种各样的选项,我不是专家,但我知道是可能的.