在2个字段的交叉过滤器中自定义化简函数

时间:2019-07-01 01:07:57

标签: mapreduce dc.js crossfilter reductio

我的数据看起来像这样

field1,field2,value1,value2
a,b,1,1
b,a,2,2
c,a,3,5
b,c,6,7
d,a,6,7

最终的目标是为value1+value2field1的每个不同值获取field2{a:15(=1+2+5+7),b:9(=1+2+6),c:10(=3+7),d:6(=6)}

我没有很好的方法来重新排列数据,所以让我们假设数据必须保持这种状态。

基于this previous question(感谢@Gordon),我使用了:

cf.dimension(function(d) { return [d.field1,d.field2]; }, true);

但是对于如何为用例编写定制的reduce函数,我有些困惑。主要问题是:从reduceAddreduceRemove函数中,我如何知道当前正在“使用”哪个键?也就是说,在我的情况下,如何知道我应该将value1还是value2考虑在内?

(已标记dc.js和Reductio,因为它可能对那些库的用户有用)

2 个答案:

答案 0 :(得分:1)

好的,所以我最后做了以下定义组的操作:

reduceAdd: (p, v) => {
    if (!p.hasOwnProperty(v.field1)) {
        p[v.field1] = 0;
    }
    if (!p.hasOwnProperty(v.field2)) {
        p[v.field2] = 0;
    }
    p[v.field1] += +v.value1;
    p[v.field2] += +v.value2;
    return p;
}
reduceRemove: (p, v) => {
    p[v.field1] -= +v.value1;
    p[v.field2] -= +v.value2;
    return p;
}
reduceInitial: () => {
    return {}
}

当您在图表中使用该组时,只需将valueAccessor更改为(d) => d.value[d.key],而不是通常的(d) => d.value

value字段中存储的数据量过多时,效率低下,但是如果没有数百万个不同的值,则基本上可以忽略不计。

答案 1 :(得分:0)

在获取数据之后,然后再将其提供给交叉过滤器之前,总是有一种很好的方式来重新排列数据;)

实际上,一旦您处理非字符串字段(数字或日期),这几乎是强制性的

您可以在多个字段上进行reduceSum

dimensions.reduceSum(function(d) {return +d.value1 + +d.value2; });