- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我正在尝试使用 Map Reduce 或 Mongodb 中的聚合框架为每个 vendor 的唯一付费用户创建一个报告。唯一的问题是总数需要标准化,这样每个用户在他/她购买的所有 vendor 中总共贡献 1。例如
{
"account": "abc",
"vendor": "amazon",
},
{
"account": "abc",
"vendor": "overstock",
},
{
"account": "ccc",
"vendor": "overstock",
}
会产生
{
"vendor": "amazon",
"total" : 0.5
},
{
"vendor": "overstock",
"total": 1.5
}
在这里,我们看到用户“abc”进行了两次购买并且对两个 vendor 的贡献相同。我们还看到,总结 vendor 总数将等于我们唯一的付费用户。
我天真的方法分四步执行此聚合。
1. For each user, store number of purchases by vendor in a map.
2. For each user, sum up total purchases and divide each vendor purchases by total.
3. Perform an additive merge of each users normalized purchase map into a final vendor map.
这种方法适用于较小的数据集,但速度较慢,而且在处理较大的数据集时会耗尽内存。
使用聚合框架,我已经弄清楚了如何计算总用户数,但采用的是标准化方法。
agg = this.db.aggregate(
[
{
$group :
{
_id :
{
vendor : '$vendor',
user : '$account'
},
total :
{
$sum : 1
}
}
}
]);
var transformed = {};
for( var index in agg.result)
{
var entry = agg.result[index];
var vendor= entry._id.vendor;
if(!transformed[vendor])
{
transformed[vendor] = 0;
}
transformed[vendor] += 1;
}
我如何重组此查询以规范化用户总数?
最佳答案
有几种方法可以应用于 .aggregate()
或 .mapReduce()
方法,它们的效率当然会有所不同,这与数据的整体大小有关。
首先使用聚合,您将需要像您所做的那样获取每个“vendor ”的总数,但随后您将需要每个用户的总体总数才能计算出您的百分比。因此,考虑到我们将不得不创建和$unwind
,分组操作的效率可能会有所不同。数组:
db.collection.aggregate([
{ "$group": {
"_id": { "account": "$account", "vendor": "$vendor" },
"count": { "$sum": 1 }
}},
{ "$group": {
"_id": "$_id.account",
"purch": { "$push": { "vendor": "$_id.vendor", "count": "$count" } },
"total": { "$sum": "$count" },
}},
{ "$unwind": "$purch" },
{ "$project": {
"vendor": "$purch.vendor",
"total": {
"$divide": [ "$purch.count", "$total" ]
}
}},
{ "$group": {
"_id": "$vendor",
"total": { "$sum": "$total" }
}}
])
mapReduce 方法必须分两步运行,首先减少用户对 vendor 的响应,然后减少 vendor :
db.collection.mapReduce(
function () {
emit(
this.account,
{
"data": [{
"vendor": this.vendor,
"count": 1,
}],
"total": 1,
"seen": false
}
);
},
function (key,values) {
var reduced = { data: [], total: 0, seen: true };
values.forEach(function(value) {
value.data.forEach(function(data) {
var index = -1;
for (var i = 0; i <=reduced.data.length-1; i++) {
if ( reduced.data[i].vendor == data.vendor ) {
index = i;
break;
}
}
if ( index == -1 ) {
reduced.data.push(data);
} else {
if (!value.seen)
reduced.data[index].count += data.count;
}
});
});
reduced.data.map(function(x) {
reduced.total += x.count;
});
return reduced;
},
{
"out": { "replace": "output" },
"finalize": function (key,value) {
var result = {
data: []
};
result.data = value.data.map(function(x) {
var res = { };
res["vendor"] = x.vendor;
res["total"] = x.count / value.total;
return res;
});
return result;
}
}
)
关于输出的第二部分:
db.output.mapReduce(
function () {
this.value.data.forEach(function(data){
emit( data.vendor, data.total );
});
},
function(key,values) {
return Array.sum( values );
},
{ "out": { "inline": 1 } }
)
所以这取决于你的数据大小。 mapReduce 方法会更慢并且需要输出到一个集合然后再次运行聚合。
另一方面,聚合框架方法通常应该运行得更快,但取决于 vendor 数组可以为每个用户提供的大小,它可能会减慢速度。
关于javascript - 聚合或 Map Reduce 以创建规范化的 'Unique Paying Users Per Vendor',我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24306876/
我想在 MySQL 中创建一个基本的 users 表。 我不希望数据库中出现重复的电子邮件或重复的用户名。 在创建表时防止这种情况的最佳方法是什么? 和以下有什么区别: 1. UNIQUE(用户名),
不可能将用户或请求识别为唯一,因为欺骗是微不足道的。 但是,有一些方法组合起来可以阻止作弊尝试并为用户提供准独特的地位。 我知道以下内容: IP 地址 - 将每个访问者的 IP 地址存储在某种数据库中
我有 2 个表: attCatAppSet, attCatAppSet_translation 在这两个表上,我对 2 列(不是主键)应用了唯一约束,因此列对值不能重复。 GO ALTER TABLE
我目前有这个: class Committee(models.Model): # ...some fields... committee_xml_id = models.Integer
这个问题在这里已经有了答案: 关闭10 年前。 Possible Duplicate: how to alter live mysql table to make a key non unique
unique() 算法可以在序列中原地移除重复的元素,这就要求被处理的序列必须是正向迭代器所指定的。在移除重复元素后,它会返回一个正向迭代器作为新序列的结束迭代器。可以提供一个函数对象作为可选的第三个
我的模型中有一个这样的字段 name = models.CharField(max_length=100, unique=True) 但现在该表/模型有很多数据,需要更改True 到 False 但无
在 Typeorm 中,您可以在列选项中设置唯一标志,或将列设置为实体的唯一。 你什么时候会使用什么,有什么区别?@Unique(["firstName"]) https://typeorm.io/#
我创建了一个名为 state 的数据集来自内置矩阵state.x77有两个连续变量(人口和收入)和两个因素变量(区域和面积)。 我使用 tapply() 计算了按地区划分的平均收入, by() , a
关于 SQLite 的问题。 在 CREATE TABLE SQL 中,我们可以通过任何一种方式添加 UNIQUE 约束:列约束或表约束。我的问题很简单。它们的工作方式不同吗? 我能找到的唯一区别是,
我在 Django 1.8 中构建模型,我正在使用抽象继承(我假设这是导致问题的原因)。我有抽象模型,然后我有基于这些抽象模型的模型。我在某些模型之间也有 ForeignKey 和 ManyToMan
我见过几个示例表,一个是 UNIQUE INDEX,另一个是 UNIQUE KEY。两者有什么区别??还是两者都一样? 最佳答案 CREATE TABLE KEY 通常是 INDEX 的同义词。 您可
我试着比较了两者,一个是pandas.unique(),另一个是numpy.unique(),我发现后者实际上超过了第一个。 我不确定卓越是否是线性的。 谁能告诉我为什么在代码实现方面存在这种差异?在
使用 PowerShell,我通过“import-csv”将文件中的 csv-data 导入对象 $csvList。这个 csv 数据有一个名为 Benutzer 的列。当做这样的事情时: $csvL
我有一个名为 GroupMembers 的表,它表示参与网站上某些社区的用户列表。 列看起来像这样: groupId | accountId | role 如您所见,里面有一个名为“role”的
我需要一个不会因 Android 设备而改变的 ID,它在任何时候都应该是唯一的,即使 WIFI、SIM 卡、蓝牙不存在,以及当用户重置他/她的手机或刷新新操作系统时也是如此。 我知道这些 Id。IM
假设我有“主题”表 CREATE TABLE subject (id int PRIMARY KEY, name VARCHAR(255) **UNIQUE**) 和相关的映射对象, @Entity
好的,让我解释一下场景。我有一个“订单”表,其中有一个自动增量键“orderno”。该表也有一个字段“orderdate”。我想要的是格式化的订单号。 (orderno_formatted) 采用以下
我有一个 boost::multi_index_container 其元素是这样的结构: struct Elem { A a; B b; C c; }; 主键(在数据库意义上)
当前列是 VARCHAR(255) NOT NULL,那么如何将其更改为 TEXT NOT NULL? 注意:要更改其属性类型的列是另一列的 UNIQUE KEY 组合。例如 唯一键(名称、描述) 列
我是一名优秀的程序员,十分优秀!