如何在大型数据集上实现尺寸图表?

时间:2014-03-18 01:03:39

标签: d3.js crossfilter dc.js

我已成功使用crossfilter,dc,d3组合为较小的数据集构建多变量图表。

我目前的系统每天迎合150万txns,我想使用上述组合来显示这些大尺寸数据的维度图表(跨越6个月)。由于显而易见的原因,我无法将这些大小的数据推到前端。

txn数据具有秒级粒度,但可视化中不需要此级别的粒度。如果txn数据可以在后端汇总到一天的粒度并将基于日期的聚合推送到前端,那么它可以大大减少IO流量和给予交叉滤波器的数据大小,直流然后直流可以显示它的可视化魔力。

提出上述想法 - >我决定通过使用下面的GROUP BY查询预先聚合来自各个维度的数据,通过将时间序列数据的粒度从毫秒减少到白天来减小数据的大小(这类似于crossfilter但在前端处完成的事情) )

  

选择TRUNC(DATELOGGED)作为DTLOGGED,CODE,ACTION,COUNT(*)AS   TXNCOUNT,GROUPING_ID(TRUNC(DATELOGGED),CODE,ACTION)AS grouping_id   从AAAA GROUP BY GROUPING SETS(TRUNC(DATELOGGED),   (TRUNC(DATELOGGED),CURR_CODE),(TRUNC(DATELOGGED),ACTION));

这些行的示例输出: 通过(TRUNC(DATELOGGED),CODE)进行聚合的元组/行将具有共同的grouping_id 1和(TRUNC(DATELOGGED),ACTION)将具有共同的grouping_id 2

 //group by DTLOGGED, CODE
{"DTLOGGED":"2013-08-03T07:00:00.000Z","CODE":"144","ACTION":"", "TXNCOUNT":69,"GROUPING_ID":1},
{"DTLOGGED":"2013-08-03T07:00:00.000Z","CODE":"376","ACTION":"", "TXNCOUNT":20,"GROUPING_ID":1},
{"DTLOGGED":"2013-08-04T07:00:00.000Z","CODE":"144","ACTION":"", "TXNCOUNT":254,"GROUPING_ID":1},
{"DTLOGGED":"2013-08-04T07:00:00.000Z","CODE":"376","ACTION":"", "TXNCOUNT":961,"GROUPING_ID":1},

//group by DTLOGGED, ACTION
{"DTLOGGED":"2013-08-03T07:00:00.000Z","CODE":"","ACTION":"ENROLLED_PURCHASE", "TXNCOUNT":373600,"GROUPING_ID":2},
{"DTLOGGED":"2013-08-03T07:00:00.000Z","CODE":"","ACTION":"UNENROLLED_PURCHASE", "TXNCOUNT":48978,"GROUPING_ID":2},
{"DTLOGGED":"2013-08-04T07:00:00.000Z","CODE":"","ACTION":"ENROLLED_PURCHASE", "TXNCOUNT":402311,"GROUPING_ID":2},
{"DTLOGGED":"2013-08-04T07:00:00.000Z","CODE":"","ACTION":"UNENROLLED_PURCHASE", "TXNCOUNT":54910,"GROUPING_ID":2},

//group by DTLOGGED
{"DTLOGGED":"2013-08-03T07:00:00.000Z","CODE":"","ACTION":"", "TXNCOUNT":460732,"GROUPING_ID":3},
{"DTLOGGED":"2013-08-04T07:00:00.000Z","CODE":"","ACTION":"", "TXNCOUNT":496060,"GROUPING_ID":3}];

问题: 这些行是分开的,即不像通常的行,其中每行在单行中具有CODE和ACTION的有效值。 在其中一个图形中进行选择后,重绘效果会删除其他图形或不显示任何数据。 请给我任何疑难解答帮助或建议更好的解决方法?

http://jsfiddle.net/universallocalhost/5qJjT/3/

1 个答案:

答案 0 :(得分:1)

所以这个问题还有一些事情要发生,所以我会尝试将它们分开:

Crossfilter适用于整洁的数据

http://vita.had.co.nz/papers/tidy-data.pdf

这意味着您需要提出一种天真的方法来填充您正在看到的空值(或者如果需要,在您对数据的初始查询中,省略了空值。如果您想真正得到您甚至可以根据其他数据推断出空值。无论您的解决方案是什么,您都需要在将数据放入交叉滤波器之前使其数据整洁。

群组和过滤操作

txnVolByCurrcode = txnByCurrcode.group().reduceSum(function(d) {
    if(d.GROUPING_ID ===1) {
        return d.TXNCOUNT;
    } else {
        return 0;
    }
});

这是对缩减进行的过滤操作。这是你应该分开的东西。允许在其他地方进行过滤(在可视化,交叉过滤器本身或在数据查询中)。

这意味着你的reduceSum变为:

var txnVolByCurrcode = txnByCurrcode.group().reduceSum(function(d) {
    return d.TXNCOUNT;
});

如果您希望用户选择要显示的组:

var groupId = cfdata.dimension(function(d) { return d.GROUPING_ID; });
var groupIdGroup = groupId.group(); // this is an interesting name
dc.pieChart("#group-chart")
    .width(250)
    .height(250)
    .radius(125)
    .innerRadius(50)
    .transitionDuration(750)
    .dimension(groupId)
    .group(groupIdGroup)
    .renderLabel(true);

有关此工作的示例: http://jsfiddle.net/b67pX/