在Hive中Statement.setMaxRows与Statement.setFetchsize有什么区别

Fil*_*nda 5 java mysql hadoop hive jdbc

我正在对Hive运行查询.相同的查询应该与其他JDBC驱动程序一起使用,这意味着其他关系数据库.

我不能使用Statement.setFetchSize方法,因为Hive JDBC 0.13.0不支持它.

我试图解决这个问题,因此,我来​​到另一个类似的方法:Statement.setMaxRows

在哪些情况下我应该使用Statement.setMaxRows vs Statement.setFetchsize?

是否可以互换使用它们?

谢谢.

Lau*_* L. 9

不,你不能互换使用它们.他们做不同的事情.setMaxRows =可以整体返回的行数.setFetchSize =将在每个数据库往返中返回的数字,即

setFetchSize为JDBC驱动程序提供一个提示,指示当此Statement生成的ResultSet对象需要更多行时,应从数据库中提取的行数.

setMaxRows设置此Statement对象生成的任何ResultSet对象可以包含给指定数字的最大行数限制.

实际上,因为setFetchSize是一个提示,驱动程序可以自由地忽略它并执行它认为合适的操作.所以不要担心Hive JDBC不支持这个.

请注意,setMaxRows正在执行的是

减小ResultSet对象的大小.它不会影响查询的速度.setMaxRows不会改变实际的SQL - 使用top/limit/rownum例如 - 因此它不会改变数据库所做的工作.如果要返回更多结果,则查询将返回比限制更多的结果,然后截断它们以适合您的ResultSet.

这个答案很好地解释了setFetchSize如何重要:

对JVM中的性能和内存管理非常重要,因为它控制从JVM到数据库的网络调用数量,以及相应的用于ResultSet处理的RAM量.


顺便说一句,setFetchSize可以在java.sql.Statement和java.sql.ResultSet上设置.默认值由创建结果集的Statement对象设置.可以随时更改提取大小.Hive JDBC拥有自己的HiveQueryResultSet和setFetchSize方法.