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

时间:2015-09-04 13:38:19

标签: java mysql hadoop jdbc hive

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

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

我正在努力解决这个问题,因此,我采用了另一种类似的方法: Statement.setMaxRows

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

是否可以互换使用?

感谢。

1 个答案:

答案 0 :(得分:8)

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

  

setFetchSize给JDBC驱动程序一个提示   更多行时应从数据库中提取的行数   需要由此Statement生成的ResultSet对象。

     

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

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

请注意,setMaxRows正在执行的是

  

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

This answer很好地解释了setFetchSize的重要性:

  

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

<小时/> Btw ,可以在java.sql.Statement和java.sql.ResultSet上设置setFetchSize。默认值由创建结果集的Statement对象设置。可以随时更改提取大小。而Hive JDBC拥有它自己的HiveQueryResultSet with a setFetchSize method