Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/hadoop/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mapreduce 2个字段上的crossfilter中的自定义reduce函数_Mapreduce_Dc.js_Crossfilter_Reductio - Fatal编程技术网

Mapreduce 2个字段上的crossfilter中的自定义reduce函数

Mapreduce 2个字段上的crossfilter中的自定义reduce函数,mapreduce,dc.js,crossfilter,reductio,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 最终目标是为field1和field2的每个不同值获得value1+value2:{a:15(=1+2+5+7),b:9(=1+2+6),c:10(=3+7),d:6(=6) 我没有一个很好的方法来重新排列数据,所以让我们假设数据必须保持这样 基于(Thank@Gordon),我使用以下映射: cf.dimension(函数(d){retur

我的数据是这样的

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)

我没有一个很好的方法来重新排列数据,所以让我们假设数据必须保持这样

基于(Thank@Gordon),我使用以下映射:

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

但是对于如何为我的用例编写定制的reduce函数,我感到有点困惑。主要问题是:在
reduceAdd
reduceRemove
函数中,我如何知道当前正在“使用”哪个键?i、 e在我的情况下,我如何知道在我的总数中应该考虑
value1
还是
value2


(标记了dc.js和reducetio,因为它可能对这些库的用户有用)

在获取数据之后,在将数据提供给crossfilter之前,您总是有一个很好的方法来重新排列数据;)


事实上,只要处理非字符串字段(数字或日期),它几乎是强制性的

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

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

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

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


低效率很小,因为在
字段中存储的数据比需要的多,但如果没有数百万个不同的值,则基本上可以忽略不计。

但这并不能解决我的问题,不是吗?实际上,只要处理非字符串字段(数字或日期)->不同意,这几乎是强制性的。如果您的服务器设置正确,您可以发回正确的类型,而不进行后期处理。顺便说一句,如果你处理的是数百万行,你不想在客户端处理转换,这是一件好事。好吧,CSV格式的一个限制是字段是非类型的,因此是字符串。我认为类型推断将出现在更新的
d3.csv
中。JSON确实允许您以本机方式表示一些类型。啊,所以如果维度是field1,您希望返回d.value1吗?我误解了你的问题,减速器不知道钥匙,所以我现在看不到解决方案;(是否有可能
field1
field2
是相同的,在这种情况下会发生什么?忽略任何其他字段,我认为最简单的解决方案可能是转换客户端中的数据,将数据展平为每行一个字段和一个值。但是,这将导致其他字段计数两次。field1d字段2总是不同的。展平将是一个选项,但我必须有2个交叉过滤器,因此内存、后处理等的2倍。我的意思是,将数据展平到一个更大的数组中,然后将其放入一个交叉过滤器中。除非有一百万行或其他内容,否则内存不应该是一个问题。不确定要进行什么后处理错误为。我无法更改当前交叉筛选器的结构(基于问题中的数据)。因此,我必须创建一个新的交叉过滤器,只使用展平的数据。我想它可以工作,但在第一个交叉过滤器上进行过滤时,我会丢失链接。我明白了。我现在想不出任何其他方法来做这件事,但我会继续考虑。这会很有帮助-不完美,但至少你可以找出行被包含的原因并使用相应的值。比我预期的要简单得多。谢谢跟进!