2014-02-11 3 views
1

Я использую клиент Python Apache Hive (https://cwiki.apache.org/confluence/display/Hive/HiveClient#HiveClient-Python) для запуска запросов на сервере Shark.Python Hive query ограничен 100

Проблема в том, что я запускаю запросы, как правило, в CLI Shark. Я получаю полный набор результатов, но когда я использую клиент 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 

Как ни странно, когда я бегу COUNT (*) в коде Python я получаю:

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

Есть установок файл или переменную, к которой я могу получить доступ, чтобы разблокировать этот предел?

ответ

1

Установлен предел в 100 рядов in the underlying Driver, ищите private int maxRows = 100;.

В maxRows устанавливаются на водителя до требуемого значения, если вы используете the fetchN() method:

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. Но это более или менее произвольное значение, которое вы можете настроить в своем коде в зависимости от ваших конкретных потребностей.

+0

Вы имеете в виду, что maxRows установлен на метод fetchAll()? – greenafrican

+0

@greenAfrican: Да, точно. Если вы следуете второй ссылке, вы найдете соответствующий вызов 'driver.setMaxRows (numRows);' in 'fetchN()' – JensG

+0

Спасибо. Решив это, используйте временную кэшированную таблицу, а затем запустите на ней COUNT, а затем fetchN (count_var). Благодарю. – greenafrican

Смежные вопросы