我需要从蜂巢取回一千万行。
字符串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这样的记录?
发布于 2021-01-04 11:10:59
如果您有一些主键候选项(可以是列的列表),那么可以按顺序使用row_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候选项是唯一的,而不是空的,因为如果PK不是唯一的,或者可以是空的,那么row_number可能有不确定的行为,并且可能在运行到运行时产生不同的结果。
如果您没有PK,则无法实现此功能,因为Hive可能由于并行执行而返回排序不同的行,这将导致跨批重复行,可能会丢失一些行。
发布于 2021-01-04 10:36:18
如果您对每一行都有某种唯一的递增id,则此解决方案应该可以工作。
获取唯一id的最小值和最大值。然后从10000的最小批次中选择,您将达到最大值。
同样的逻辑也可以应用于时间戳字段,您可以从一天开始,直到一天结束,分批15分钟或1小时或任何适合您的批处理要求。如果数据不是极不正确的话,这将是可行的。
如果您想使用jdbc templatee来实现它,您可以使用RowCallbackHandler或ResultSetExtractor作为参数。
若要设置由结果集同时获取的行数,请重写applyStatementSettings()并调用Statement.setFetchSize()
你可以在这里读到更多关于它的内容。
https://stackoverflow.com/questions/65561041
复制相似问题