在Java或C++等编程语言中有效地模拟SQL的group by子句,而不是求助于RDBMS
Efficiently emulate SQL's group by clause in a programming language like Java or C++ instead of resorting to an RDBMS
我想在上载的文件上执行动态SQL GROUP BY。我不想先将文件存储在数据库中,然后再执行子句,因为这对我的需求来说太费时了。
我可以在Java或c++中使用的有效算法是什么?最好是c++。
提前感谢您的任何想法和答案。
最简单的方法可能是对SQL中group by
子句中使用的字段上的数据进行排序。
分组具有比排序更宽松的约束,因此理论上它可能比排序稍微快一些,但除非您处理的是大量数据,否则您不太可能看到速度差异。
当您使用SQL的汇总功能时,最大的区别就出现了。例如,select x, count(x) from wherever, group by x
将显示x
的每个值和每个值的计数。对于这样的功能,您通常会在c++中使用std::map
或std::unordered_map
,或者在Java中使用HashMap
或TreeMap
。
编辑:对于一个确实微不足道的示例,让我们考虑一个相当简单的group-by子句的结果,其中我们想要在不同年份出生的人的计数。我们将从这样的原始数据开始:
last-name<tab>first-name<tab>height<tab>birth-year
所以(例如)我将被编码为:
CoffintJerryt70t1964
在SQL中,我们可以使用:
select birth_year, count(birth_year)
from people
group by birth_year
order by birth_year
对于c++中的粗略等价,我们可以这样写代码:
struct person {
std::string last_name;
std::string first_name;
int height;
int birth_year;
};
我们从一个文件中读取一群人的数据,就像这样:
std::ifstream in("people.txt");
std::vector<person> people((std::istream_iterator<person>(in)),
std::istream_iterator<person>());
然后我们会像这样收集我们关心的数据:
std::map<int, int> year_counts;
for ( auto &p : people)
++year_counts[p.birth_year];
然后我们可以像这样打印出数据:
std::cout << "YeartCountn";
for (auto c : year_counts)
std::cout << c.first << "t" << c.second << "n";
使用guava,它的函数可以用来取出group by字段,并且它的multimap可以保存从group by到该条目实例的引用。例子可以在这里找到:http://www.gregbugaj.com/?p=228
public class GroupByMultimap {
public static void main(String[] args) {
Object[] o1 = new Object[] { 1, "Greg", "Dev" };
Object[] o2 = new Object[] { 2, "Leo", "Support" };
Object[] o3 = new Object[] { 3, "Roman", "Dev" };
Object[] o4 = new Object[] { 4, "Jobby", "Support" };
List<Object[]> rows = Lists.newArrayList(o1, o2, o3, o4);
Multimap<String, Object[]> grouped = Multimaps.index(rows,
new Function<Object[], String>() {
@Override
public String apply(Object[] item) {
return (String) item[2];
}
});
Iterator<String> keyIterator = grouped.asMap().keySet().iterator();
while (keyIterator.hasNext()) {
String key = keyIterator.next();
System.out.println("key = " + key);
Collection<Object[]> dataRows = grouped.get(key);
for (Object[] o : dataRows) {
System.out.println(String.format(" %d : %s", o[0], o[1]));
}
}
}
}
相关文章:
- 如何理解C++标准N3337中的expr.const.cast子句8
- 使用模板进行堆栈实现; "name followed by :: must be a class or namespace"
- if 子句中的赋值不起作用
- C++20 概念:如何在"requires"子句中引用类名?
- 尝试将另一个子句添加到代码中时出错
- 将 std::thread by 值推送到列表中
- 对OpenMP reduction子句中的变量执行原子操作
- MATLAB to C++: csvread() not supported by MATLAB Coder
- 要求子句中不允许哪些替换失败?
- Makefile by ocaml 和 cpp 扩展名
- "using namespace"子句在什么范围内有效?
- C++ OpenCV Randu 函数抛出'Integer division by zero'
- 从函数 BY VALUE 返回数组,返回结构时会发生什么?
- 如何在不受其他文件影响的情况下"by itself" Visual Studio 项目中运行C++文件?
- 在编译时计算"if"子句
- OpenMP 条件并行化 - 并行部分中 if 子句的语法
- 在 CPP 中使用正则表达式将密码("ABC")子句屏蔽为密码("****")
- 如何加快有序子句的 openmp 并行速度?
- MacPorts:"Error: clang-4.0 has been replaced by clang-8.0; please install that instead",但我已经安装了clang
- 在Java或C++等编程语言中有效地模拟SQL的group by子句,而不是求助于RDBMS