【问题标题】:custom reduce functions in crossfilter on 2 fields2个字段的交叉过滤器中的自定义reduce函数
【发布时间】: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

最终目标是为field1field2 的每个不同值获取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 函数,我感到有些困惑。主要问题是:在 reduceAddreduceRemove 函数中,我如何知道当前正在“使用”哪个键?即在我的情况下,我怎么知道我是否应该在我的总和中考虑 value1value2

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

【问题讨论】:

  • 有没有可能field1field2是一样的,在这种情况下应该怎么办?忽略任何其他字段,我认为最简单的解决方案可能是转换客户端中的数据,展平为每行只有一个字段和一个值。但是,这会导致其他字段被计算两次。
  • Field1 和 field2 总是不同的。展平是一种选择,但我必须有 2 个交叉过滤器,因此内存、后处理等是 2 倍。
  • 我的意思是,将数据扁平化为一个更大的数组,然后将其放入一个交叉过滤器中。除非您有一百万行或其他东西,否则内存应该不是问题。不确定您指的是什么后期处理。
  • 我无法更改当前交叉过滤器的结构(基于问题中的数据)。因此,我将不得不创建一个仅包含展平数据的新交叉过滤器。我想它可以工作,但在第一个交叉过滤器上过滤时我会丢失链接。
  • 我明白了。目前我想不出任何其他方式来做到这一点,但我会继续考虑。 if the group key were available to the reduce functions 会有所帮助 - 不完美,但至少您可以弄清楚为什么包含该行并使用相应的值。

标签: mapreduce dc.js crossfilter reductio


【解决方案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 字段中存储的数据多于所需数据,因此效率低下,但如果您没有数百万个不同的值,则基本上可以忽略不计。

【讨论】:

  • 比我想象的要简单得多。感谢您的跟进!
【解决方案2】:

你总是有一个很好的方法来重新排列数据,在你获取它之后和你将它提供给交叉过滤器之前;)

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

您可以对多个字段进行 reduceSum

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

【讨论】:

  • 但这并不能解决我的问题,不是吗?您只是将两个值相加。
  • 事实上,只要您处理非字符串字段(数字或日期)-> 不同意,这几乎是强制性的。如果您的服务器设置正确,您可以发回正确的类型而不进行后处理。顺便说一句,如果您要处理数百万行不想处理转换客户端的行,这是一件好事。
  • 嗯,CSV 格式的限制是字段没有类型,因此是字符串。我认为类型推断将出现在更新的d3.csv 中。 JSON 确实允许您以原生方式表达一些类型。
  • 啊,所以如果维度是field1,你想返回d.value1?我误解了你的问题,reducer 不知道关键,所以我现在没有看到解决方案;(
猜你喜欢
  • 1970-01-01
  • 2023-03-07
  • 1970-01-01
  • 2015-02-05
  • 2018-09-08
  • 1970-01-01
  • 1970-01-01
  • 2013-11-20
  • 2017-12-27
相关资源
最近更新 更多