【发布时间】:2019-07-01 01:07:57
【问题描述】:
我的数据是这样的
field1,field2,value1,value2
a,b,1,1
b,a,2,2
c,a,3,5
b,c,6,7
d,a,6,7
最终目标是为field1 和field2 的每个不同值获取value1+value2:{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 函数,我感到有些困惑。主要问题是:在 reduceAdd 和 reduceRemove 函数中,我如何知道当前正在“使用”哪个键?即在我的情况下,我怎么知道我是否应该在我的总和中考虑 value1 或 value2 ?
(已标记 dc.js 和 reductio,因为它可能对这些库的用户有用)
【问题讨论】:
-
有没有可能
field1和field2是一样的,在这种情况下应该怎么办?忽略任何其他字段,我认为最简单的解决方案可能是转换客户端中的数据,展平为每行只有一个字段和一个值。但是,这会导致其他字段被计算两次。 -
Field1 和 field2 总是不同的。展平是一种选择,但我必须有 2 个交叉过滤器,因此内存、后处理等是 2 倍。
-
我的意思是,将数据扁平化为一个更大的数组,然后将其放入一个交叉过滤器中。除非您有一百万行或其他东西,否则内存应该不是问题。不确定您指的是什么后期处理。
-
我无法更改当前交叉过滤器的结构(基于问题中的数据)。因此,我将不得不创建一个仅包含展平数据的新交叉过滤器。我想它可以工作,但在第一个交叉过滤器上过滤时我会丢失链接。
-
我明白了。目前我想不出任何其他方式来做到这一点,但我会继续考虑。 if the group key were available to the reduce functions 会有所帮助 - 不完美,但至少您可以弄清楚为什么包含该行并使用相应的值。
标签: mapreduce dc.js crossfilter reductio