首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从Apache Java 8+ Spring Boot + Hive 1.2.1版本中批量检索百万条记录

从Apache Java 8+ Spring Boot + Hive 1.2.1版本中批量检索百万条记录
EN

Stack Overflow用户
提问于 2021-01-04 10:24:22
回答 2查看 879关注 0票数 1

我需要从蜂巢取回一千万行。

字符串sql = table_name中的select *

List<Map<String, Object>> resultSet = jdbctemplate.queryForList(String sql)

上面的方法运行良好,一次检索100万行(单次命中),内存为2GB。从30 MB(100万行)的表大小中选择记录只需3-4分钟。

但是对于100多万个记录来说,存在内存问题,并且需要更多的时间。

我需要使用偏移量值查询Hive,但是对于1.2.1版本,似乎没有偏移子句。

还有其他方法从蜂巢中选择记录作为批处理吗?选择第一个10K记录和下一个10K这样的记录?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-01-04 11:10:59

如果您有一些主键候选项(可以是列的列表),那么可以按顺序使用row_number():

代码语言:javascript
复制
select --column list here
from (
    select t.*, row_number() OVER (ORDER by PK) as rn --use PK in order by
    from table_name t
    ) s
where rn between 1000001 and 2000000

只需检查您的PK候选项是唯一的,而不是空的,因为如果PK不是唯一的,或者可以是空的,那么row_number可能有不确定的行为,并且可能在运行到运行时产生不同的结果。

如果您没有PK,则无法实现此功能,因为Hive可能由于并行执行而返回排序不同的行,这将导致跨批重复行,可能会丢失一些行。

票数 0
EN

Stack Overflow用户

发布于 2021-01-04 10:36:18

如果您对每一行都有某种唯一的递增id,则此解决方案应该可以工作。

获取唯一id的最小值和最大值。然后从10000的最小批次中选择,您将达到最大值。

同样的逻辑也可以应用于时间戳字段,您可以从一天开始,直到一天结束,分批15分钟或1小时或任何适合您的批处理要求。如果数据不是极不正确的话,这将是可行的。

如果您想使用jdbc templatee来实现它,您可以使用RowCallbackHandler或ResultSetExtractor作为参数。

若要设置由结果集同时获取的行数,请重写applyStatementSettings()并调用Statement.setFetchSize()

你可以在这里读到更多关于它的内容。

https://docs.spring.io/spring-framework/docs/3.1.x/javadoc-api/org/springframework/jdbc/core/JdbcTemplate.html

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65561041

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档