【发布时间】:2018-01-22 01:53:28
【问题描述】:
我想实现可以连接到任何 sql server 并从中加载任何表的 java 应用程序。对于每个表,我想根据一些任意列创建直方图。
例如,如果我有这张桌子
name profit
------------
name1 12
name2 14
name3 18
name4 13
我可以根据利润列的最小值和最大值以及每个 bin 的记录数来创建 bin 大小为 4 的直方图。
结果是:
profit count
---------------
12-16 3
16-20 1
我对这个问题的解决方案是根据所需列检索所有数据,然后使用 java 流 Collectors.groupingBy 按记录构造 bin 和分组。
我不确定我的解决方案是否经过优化,为此我需要一些帮助来找到更好的算法,特别是当我有大量记录时。(例如使用 sql server 或其他可以使用的框架的一些好处.)
我可以使用更好的算法来解决这个问题吗?
编辑 1: 假设我的 sql 结果在列表数据中
private String mySimpleHash(Object[] row, int index) {
StringBuilder hash = new StringBuilder();
for (int i = 0; i < row.length; i++)
if (i != index)
hash.append(row[i]).append(":");
return hash.toString();
}
//index is index of column for histogram
List<Object[]> histogramData = new ArrayList<>();
final Map<String, List<Object[]>> map = data.stream().collect(
Collectors.groupingBy(row -> mySimpleHash(Arrays.copyOfRange(row, index))));
for (final Map.Entry<String, List<Object[]>> entry : map.entrySet()) {
Object[] newRow = newData.get(rowNum);
double result = entry.getValue().stream()
.mapToDouble(row ->
Double.valueOf(row[index].toString())).count();
newRow[index] = result;
histogramData.add(newRow);
}
【问题讨论】:
-
你有代码吗?
-
是的,我添加一个简单的。
标签: java sql sql-server optimization query-optimization