首页 > 解决方案 > 在来自 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;
}

标签: hivejava-streamjdbctemplate

解决方案


看起来没有内置的解决方案,但你可以做到。基本上,您将现有功能包装在迭代器中,并使用拆分器将其转换为流。这是有关该主题的博客文章:

该代码实现了 Spring 的 ResultSetExtractor 接口,它是一个单一抽象方法 (SAM) 接口,允许使用 lambda 表达式来实现它。

该实现将 SQL ResultSet 包装在一个迭代器中,使用 Spliterators 和 StreamSupport 实用程序类构造一个流,并将其应用于获取行集流并返回通用结果的函数。


推荐阅读