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

9
我正在对Hive运行查询。相同的查询应该可以使用其他JDBC驱动程序工作,也就是说,其他关系型数据库。
由于Hive JDBC 0.13.0不支持方法Statement.setFetchSize,因此我无法使用它。
为了解决这个问题,我找到了另一个类似的方法:Statement.setMaxRows
在什么情况下应该使用Statement.setMaxRows而不是Statement.setFetchsize?
它们是否可以互换使用?
谢谢。

你可以参考https://dev59.com/mXM_5IYBdhLWcg3wTRHL。 - Rahul Yadav
你确定在Hive V0.13.0中不支持"setFetchsize"吗?那为什么不使用V0.13.1驱动程序(或0.14等)来连接你的V0.13.0服务呢? - Samson Scharfrichter
您可能还想了解 https://dev59.com/8VwY5IYBdhLWcg3wWmtn - Kanagavelu Sugumar
1个回答

11
不,你不能将它们互换使用。它们有不同的功能。setMaxRows = 返回的总行数限制。setFetchSize = 每次数据库往返中将返回的行数,即:

setFetchSize 向JDBC驱动程序提供提示,指示在需要为由该语句生成的ResultSet对象获取更多行时应从数据库获取多少行。

setMaxRows 将由该语句对象生成的任何ResultSet对象所包含的最大行数限制为给定数量。

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

注意,setMaxRows所做的所有工作都只是

减小ResultSet对象的大小。它不会影响查询的速度。setMaxRows不会改变实际的SQL——例如使用top/limit/rownum——因此它不会改变数据库所做的工作。如果有更多结果需要返回,则查询将返回更多结果,然后将其截断以适合您的ResultSet。 这个答案很好地解释了setFetchSize的重要性:
对于JVM内存管理和性能来说非常重要,因为它控制从JVM到数据库之间的网络调用次数,相应地控制了ResultSet处理所使用的内存量。


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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接