如何在大型数据集上实现二维制图?
我已成功使用crossfilter,dc,d3的组合为较小的数据集构建多变量图表。
我目前的系统每天可以满足150万txns的要求,并且我希望使用上述组合在这个大型数据(跨越6个月)上显示尺寸图。 出于显而易见的原因,我无法将这些大小的数据推送到前端。
txn数据具有秒级粒度,但该级别的粒度在可视化中不是必需的。 如果txn数据可以在后端滚动到一天的粒度,并将基于日期的聚合推送到前端,那么它可以大幅降低IO流量和给交叉过滤器的数据大小,直流和直流可以显示它的可视化魔术。
推进上述想法 - >我决定通过使用下面的GROUP BY查询来预先聚合来自各个维度的数据,从而将时间序列数据的粒度从毫秒减少到日,从而减少数据的大小(这类似于东西由crossfilter完成,但在前端)
SELECT TRUNC(DATELOGGED)as DTLOGGED,CODE,ACTION,COUNT(*)as TXNCOUNT,GROUPING_ID(TRUNC(DATELOGGED),CODE,ACTION)as grouping_id FROM AAAA GROUP BY GROUPING SETS(TRUNC(DATELOGGED),(TRUNC(DATELOGGED), CURR_CODE),(TRUNC(DATELOGGED),ACTION));
这些行的示例输出:聚合由(TRUNC(DATELOGGED),CODE)完成的元组/行将具有相同的grouping_id 1,by(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/
所以在这个问题上有几件事情,所以我会尝试将它们分开:
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/
链接地址: http://www.djcxy.com/p/5595.html