Crossfilter 是不是需要平面数据结构?
Posted
技术标签:
【中文标题】Crossfilter 是不是需要平面数据结构?【英文标题】:Does Crossfilter require a flat data structure?Crossfilter 是否需要平面数据结构? 【发布时间】:2013-06-11 11:26:09 【问题描述】:我发现的所有 Crossfilter 示例都使用这样的扁平结构:
[
name: “Rusty”, type: “human”, legs: 2 ,
name: “Alex”, type: “human”, legs: 2 ,
...
name: “Fiona”, type: “plant”, legs: 0
]
或
"date","open","high","low","close","volume","oi" 11/01/1985,115.48,116.78,115.48,116.28,900900,0 11/04/1985,116.28,117.07,115.82,116.04,753400,0
11/05/1985,116.04,116.57,115.88,116.44,876800,0
我处理了数百 MB 的平面文件,以生成一个 1-2MB 的 JSON 对象,其结构大致如下:
"meta": "stuff": "here",
"data":
"accountName":
// rolled up by week
"2013-05-20":
// any of several "dimensions"
"byDay":
"2013-05-26":
"values":
"thing1": 1,
"thing2": 2,
"etc": 3
,
"2013-05-27":
"values":
"thing1": 4,
"thing2": 5,
"etc": 6
// and so on for day
,
"bySource":
"sourceA":
"values":
"thing1": 2,
"thing2": 6,
"etc": 7
,
"sourceB":
"values":
"thing1": 3,
"thing2": 1,
"etc": 2
我想显示为如下表格:
Group: byDay* || bySource || byWhatever
| thing1 | thing2 | etc
2013-05-26 | 1 | 2 | 2
2013-05-27 | 4 | 5 | 7
或:
Group: byDay || bySource* || byWhatever
| thing1 | thing2 | etc
sourceA | 2 | 6 | 6
sourceB | 3 | 1 | 3
扁平化这个 JSON 结构会很困难,并且会产生一个非常大的对象。
我很想利用 Crossfilter 的精彩功能,但我不确定这是否可行。
我是否可以向 Crossfilter 定义/解释我当前的结构?也许还有另一种方法可以解决这个问题?我很乐意承认我对维度和许多其他关键的 Crossfilter 概念没有很好的掌握。
【问题讨论】:
【参考方案1】:Crossfilter 作用于记录数组,数组的每个元素通过维度(使用访问函数定义)映射到一个或多个值。
即使您的数据包含汇总结果,您也可以将其与 Crossfilter 一起使用,但请注意,技术上不可能组合已跨不同维度汇总的数据,例如组合“按天”和上面示例中的“按来源”数据。您可以为每个聚合维度创建一个交叉过滤器,例如一个用于“按天”,并对此运行查询和组,但我不确定与您已有的相比会有多大用处。
至于内存使用,你确定扁平化你的扁平化结构真的会有那么大的问题吗?请记住,每条记录(展平数组的元素)都可以包含对嵌套结构中的字符串和其他对象的引用,因此您不一定会占用那么多内存。
【讨论】:
我已经编辑了我的问题以显示我希望从数据中获得的一些观点。我不确定我将如何展平数据结构。它包括汇总/求和值(不是原始值)。上面的例子会变成像gist.github.com/jfsiii/5786087 这样的东西吗?很抱歉任何通知垃圾邮件。我了解到评论文本字段与问题文本字段的行为不同。 您的示例视图只是数据的表格形式。您能否举例说明您希望 Crossfilter 显示的查询类型(组或过滤器)? 我已更新答案以解决您关于合并聚合的问题。 感谢您对合并聚合维度的说明。谢天谢地,我不需要这样做。我只是想按数据、来源等维度进行分组,然后在该视图中找到前 K 次点击或按展示次数排序。day
和 source
是 Crossfilter 用语中的 dimension
s 吗?我毫不怀疑我在问如何在乘客座位上面向后方驾驶这辆车。我正在努力了解自己的方向,但遇到了困难,因为我的初始数据结构与所有示例都如此不同。我们可以在 IRC/IM 上聊天吗?我会把时间限制在你想要的任何时间。
默认情况下交叉过滤是否对键和值使用字符串引用?我重复的字段名称基本上都指向一个实例,还是建议我使用 1-2 个字符的字段名称?以上是关于Crossfilter 是不是需要平面数据结构?的主要内容,如果未能解决你的问题,请参考以下文章
crossfilter.js & dc.js:对要使用的维度和事实的数量有限制吗?
怎样才可以有一个自定义的减少在我crossfilter组功能?
使用 dc.js 和 crossfilter.js 在 barChart 中正确显示 bin 宽度
CoreData(iOS):是不是需要创建数据库才能使用CoreData?coredata可以对简单的平面文件进行操作吗? [关闭]