1

Python Apache Hive クライアント ( https://cwiki.apache.org/confluence/display/Hive/HiveClient#HiveClient-Python ) を使用して、Shark サーバーでクエリを実行しています。

問題は、Shark CLI で通常どおりクエリを実行すると完全な結果セットが得られるが、Hive Python クライアントを使用すると 100 行しか返されないことです。選択クエリに制限はありません。

サメ CLI:

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

パイソン:

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']

この制限を解除するためにアクセスできる設定ファイルまたは変数はありますか?

4

1 に答える 1

1

基礎となる Driverで 100 行の制限が設定されています。を探してくださいprivate int maxRows = 100;

fetchN() メソッドを使用する場合、ドライバで maxRows が目的の値に設定されます。

public List<String> fetchN(int numRows) 

考えられる回避策として、最初に行の総数を取得してから、fetchN() を呼び出します。ただし、返されるデータに膨大な数の行が含まれる可能性がある場合は、問題が発生する可能性があります。そのため、データをチャンクで取得して処理する方がはるかに優れているようです。比較のために、CLI の機能を次に示します

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

どこでLINES_TO_FETCH = 40。ただし、これは多かれ少なかれ任意の値であり、特定のニーズに応じてコードを微調整できます。

于 2014-02-11T20:02:47.493 に答える