hive - 在来自 HIVE 的 JDBCTemplate 结果上使用 Java8 Stream
问题描述
我正在使用 jdbcTemplate 查询配置单元,然后将结果写入 .csv 文件。我基本上只是生成一个对象列表,然后对列表进行蒸汽处理以将每条记录写入文件。我希望在结果从配置单元返回时流式传输并将其写入文件,而不是等待获取整个内容然后处理它。谁能指出我正确的方向?谢谢!
private List<Avs> queryAvsData(String asSql) {
List<Avs> llistAvs = new ArrayList<Avs>();
List<Map<String, Object>> rows = hiveJdbcTemplate.queryForList(asSql);
Iterator<Map<String, Object>> it = rows.iterator();
while (it.hasNext()) {
Map<String, Object> row = it.next();
Avs laAvs = Avs.builder()
.make((String) row.get("make"))
.model((String) row.get("model"))
.build();
llistAvs.add(laAvs);
}
return llistAvs;
}
解决方案
看起来没有内置的解决方案,但你可以做到。基本上,您将现有功能包装在迭代器中,并使用拆分器将其转换为流。这是有关该主题的博客文章:
该代码实现了 Spring 的 ResultSetExtractor 接口,它是一个单一抽象方法 (SAM) 接口,允许使用 lambda 表达式来实现它。
该实现将 SQL ResultSet 包装在一个迭代器中,使用 Spliterators 和 StreamSupport 实用程序类构造一个流,并将其应用于获取行集流并返回通用结果的函数。
推荐阅读
- c - 了解 makefile 的依赖级别
- wordpress - 如何减少 Wordpress 中标题和 iframe 之间的空间?
- git - 处理来自 magit 扩展的交互式 git 命令
- python - 在 Google App Engine 中使用 ctypes 来使用二进制文件?
- python - pip 无法解析 require.txt 中的依赖关系
- php - Laravel 未定义方法
- python-3.x - 如何在执行该类的所有其他方法之前运行一次 pytest 方法
- mysql - SQL 行锁和事务
- octobercms - 是否可以更改开关的文本?
- sql - 如何在 Oracle 的 SQL 中使用 REGEXP_SUBSTR 将空槽替换为自定义消息