Python Hive查询限制为100

时间:2014-02-11 13:40:41

标签: python hive thrift thrift-protocol

我正在使用Python Apache Hive客户端(https://cwiki.apache.org/confluence/display/Hive/HiveClient#HiveClient-Python)在Shark服务器上运行查询。

问题是当我在Shark CLI中正常运行查询时,我获得了一整套结果,但是当我使用Hive Python客户端时,它只返回100行。我的选择查询没有限制。

Shark CLI:

[localhost:10000] shark> SELECT COUNT(*) FROM table;
46831

的Python:

import sys
from hive_service import ThriftHive
from hive_service.ttypes import HiveServerException
from thrift import Thrift
from thrift.transport import TSocket
from thrift.transport import TTransport
from thrift.protocol import TBinaryProtocol

try:
    transport = TSocket.TSocket('localhost', 10000)
    transport = TTransport.TBufferedTransport(transport)
    protocol = TBinaryProtocol.TBinaryProtocol(transport)

    client = ThriftHive.Client(protocol)
    transport.open()

    client.execute("SELECT * from table")
    hdata = client.fetchAll()
    transport.close()
    ....

In [97]: len(hdata)
Out[97]: 100

奇怪的是,当我在Python代码中运行COUNT(*)时,我得到了:

In [104]: hdata
Out[104]: ['46831']

是否有我可以访问的设置文件或变量来解锁此限制?

1 个答案:

答案 0 :(得分:1)

设置in the underlying Driver的限制为100行,查找private int maxRows = 100;

如果您使用the fetchN() method

,则会在驱动程序上将maxRows设置为所需的值
public List<String> fetchN(int numRows) 

可能的解决方法可能涉及首先获取总行数,然后调用fetchN()。但是如果返回的数据涉及潜在的大量行,则可能会遇到麻烦。出于这个原因,以块的形式获取和处理数据似乎是一个更好的主意。为了进行比较,here's what the CLI does

do {
  results = client.fetchN(LINES_TO_FETCH);
  for (String line : results) {
    out.println(line);
  }
} while (results.size() == LINES_TO_FETCH);

其中LINES_TO_FETCH = 40。但这或多或少是一个任意值,您可以根据自己的特定需求调整代码。