Crossfilter汇总结果

时间:2016-09-19 09:56:13

标签: javascript visualization dc.js crossfilter

我使用Crossfilter(DC.JS,因此D3)来显示大量数据。我喜欢图书馆的互动性,但我的数据很快变得太大了。我认为最适合处理此问题的方法是,如果数据太大,则预先聚合我的数据。我很难找到Crossfilter如何处理这类数据。

为了说明,我所拥有的数据的格式为

[
    {"date":"01-01-2016","food": "apple", "gender": "M", "country": "DE"},
    {"date":"01-01-2016","food": "pear", "gender": "M", "country": "DE"},
    {"date":"01-01-2016","food": "apple", "gender": "F", "country": "DE"},
    {"date":"01-01-2016","food": "apple", "gender": "F", "country": "UK"},
    {"date":"01-02-2016","food": "pear", "gender": "M", "country": "UK"},
    {"date":"01-02-2016","food": "pear", "gender": "M", "country": "UK"},
    {"date":"01-02-2016","food": "apple", "gender": "M", "country": "US"},
    ...
]

如何通过在日期字段周围显示此旋转来进行操作?所以知道在01-01,我有3个人买苹果,2个来自DE(1个男性,1个女性)和1个来自英国,例如?

我想我可以通过为每个组合计算一种数据立方体然后对其进行计数来实现这一点,如下所示:

[
    {"date":"01-01-2016","food": "apple", "gender": "M", "country": "DE", "count": 100000},
    {"date":"01-01-2016","food": "pear", "gender": "M", "country": "DE", "count": 72651},
    {"date":"01-01-2016","food": "apple", "gender": "F", "country": "DE", "count": 12345},
    {"date":"01-01-2016","food": "apple", "gender": "F", "country": "UK", "count": 9287164},
    {"date":"01-02-2016","food": "pear", "gender": "M", "country": "UK", "count": 291732743},
    {"date":"01-02-2016","food": "apple", "gender": "M", "country": "US", "count": 128176376}
    ...
]

但是通过这种设置,我对数据量并没有太大的帮助,而且我不完全确定Crossfilter如何处理所表示的数据是这样的。

1 个答案:

答案 0 :(得分:1)

这个问题相当广泛*,但现在就这样了。

在Crossfilter中有几种方法可以解决这个问题。我会按照复杂程度或多或少地列出它们:

  1. 使用令牌为键和值缩小记录。例如,{"date":"01-01-2016","food": "apple", "gender": "M", "country": "DE"}可能会变为{"d":"01-01-2016","f": "a", "g": "M", "c": "DE"},这会为每条记录节省几个字节。
  2. 按照您的描述预先汇总您的记录。对于计数,这很容易。如前所述,您使用预聚合记录的数量进行预聚合,然后使用crossfilter.group.reduceSum(function(d) { return d.count; })或类似的方法来聚合计数的总和。对于其他类型的聚合,它变得更复杂并且可能需要定制的缩减器,但通常可能有一些东西。如果您遇到特定聚合问题,请创建一个关于该问题的新问题并准确地列出问题。
  3. 只需从服务器端驱动基于Crossfilter的API。你将失去一些互动性,但这是一个坚实的方法。这里记录了几种解决方案:https://github.com/dc-js/dc.js/wiki/FAQ#how-do-i-replace-crossfilter-with-a-server-side-solution
  4. 使用组合方法,您可以在服务器端进行预聚合,但仍然处理客户端的过滤和最终聚合。使用我知道的Crossfilter执行此操作的唯一示例是:http://lcadata.info(此处为源代码:https://github.com/esjewett/lcadata)。这是一个真正依赖数据的解决方案,这里没有通用库。
  5. 正交所有这一切正在将Crossfilter转移到网络工作者,这可以帮助实现交互性,但不能真正帮助解决数据量问题。

    我的建议:执行上面的#1并确定您可以使用所需的交互级别支持多少条记录。然后,如有必要,执行#2。如果这还不够,请确定#3是否是一个选项,如果是,则执行此操作。否则考虑#4,但要明白你正在进行一项非常先进的任务,并且会在很大程度上开辟自己的道路。

    *为了回答您的任何具体问题,我们需要更多信息,例如您尝试加载所显示类型的记录数量,实际需要的维度,所需的群组类型创造等等。