Java8+SpringBoot+Hive1.2.1版本中批量检索百万条记录

8ljdwjyq  于 2021-06-29  发布在  Java
关注(0)|答案(2)|浏览(238)

我需要从Hive中取回一千万行。
string sql=从表名称中选择* List<Map<String, Object>> resultSet = jdbctemplate.queryForList(String sql) 上面的方法运行良好,一次检索100万行(单次命中),占用2gb堆内存。从30 mb(100万行)的表中选择记录只需要3-4分钟。
但对于超过100万条记录来说,存在内存问题,需要更多的时间。
我需要用offset值查询配置单元,但是对于1.2.1版本,似乎没有offset子句。
有没有其他方法可以从配置单元中批量选择记录?选择前10公里记录和下一个10公里记录?

qzlgjiam

qzlgjiam1#

如果您有一些主键候选者(可以是列列表)可以按顺序使用,那么您可以使用row\ u number():

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候选者是否唯一且不为null,因为如果pk不唯一或可以为null,则行号可能具有不确定性行为,并且可能在不同的运行中产生不同的结果。
如果没有pk,则无法实现此功能,因为配置单元可能会由于并行执行而返回顺序不同的行,这将导致跨批重复行,某些行可能会丢失。

fnx2tebb

fnx2tebb2#

如果您对每一行都有某种唯一的递增id,那么这个解决方案应该可以工作。
获取唯一id的最小值和最大值。然后从最小值中批量选择10000个将达到最大值。
同样的逻辑可以应用于时间戳字段,您可以从一天的开始到一天的结束,以15分钟或1小时或任何适合您的批量要求的方式进行批量操作。如果数据不是非常倾斜的话,这将是可行的。
如果您想使用jdbc templatee来实现,可以使用rowcallbackhandler或resultsetextractor作为参数。
要设置resultset一次获取的行数,请重写applystatementsettings()和call语句。setfetchsize()
你可以在这里了解更多。
https://docs.spring.io/spring-framework/docs/3.1.x/javadoc-api/org/springframework/jdbc/core/jdbctemplate.html

相关问题