我已成功使用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的有效值。 在其中一个图形中进行选择后,重绘效果会删除其他图形或不显示任何数据。 请给我任何疑难解答帮助或建议更好的解决方法?
答案 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/