2

pyhive を使用して Python をハイブに接続したいと考えています。以下の python スクリプトを使用してローカルで実行しています。

#!/usr/bin/env python
# coding: utf-8
from pyhive import hive
from TCLIService.ttypes import TOperationState
def mysql_connect(host, port, username):
 conn = hive.Connection(host=host, port=port, username=username)
 return conn.cursor()

cursor = mysql_connect("localhost", 50070, "hduser")
cursor.execute("show databases")
print_log(cursor)

/usr/local/lib/python2.7/dist-packagesの場所にpyhiveが存在しますが、次の出力になります

vaibhav@vaibhav-Lenovo-G570:~/Desktop/Python/Automation$ ./pyhive_test.py
Traceback (most recent call last):
  File "./pyhive_test.py", line 9, in <module>
    cursor = mysql_connect("localhost", 50070, "hduser")
  File "./pyhive_test.py", line 6, in mysql_connect
    conn = hive.Connection(host=host, port=port, username=username)
  File "/usr/local/lib/python2.7/dist-packages/pyhive/hive.py", line 131, in __init__
    self._transport.open()
  File "/usr/local/lib/python2.7/dist-packages/thrift_sasl/__init__.py", line 80, in open
    status, payload = self._recv_sasl_message()
  File "/usr/local/lib/python2.7/dist-packages/thrift_sasl/__init__.py", line 101, in _recv_sasl_message
    payload = read_all_compat(self._trans, length)
  File "/usr/local/lib/python2.7/dist-packages/thrift_sasl/six.py", line 31, in <lambda>
    read_all_compat = lambda trans, sz: trans.readAll(sz)
  File "/home/vaibhav/.local/lib/python2.7/site-packages/thrift/transport/TTransport.py", line 60, in readAll
    chunk = self.read(sz - have)
  File "/home/vaibhav/.local/lib/python2.7/site-packages/thrift/transport/TSocket.py", line 132, in read
    message='TSocket read 0 bytes')
thrift.transport.TTransport.TTransportException: TSocket read 0 bytes

編集 1. ファイルの名前が Pyhive から pyhive_test に変更されました

  1. pyhive.py がディレクトリから削除されました

試した可能な解決策: 1.python2.7 と python 3.4 の 2 つのバージョンがインストールされています。Python3.4 をアンインストールしましたが、まだフォルダーが /usr/local/lib/ にあるようです。以下のコマンドのいくつかを実行して、Python がインストールされている場所と PYTHONPATH で利用可能なパッケージを確認しました

vaibhav@vaibhav-Lenovo-G570:~$ which -a python
/usr/bin/python
vaibhav@vaibhav-Lenovo-G570:~$ python -c "import sys, pprint; pprint.pprint(sys.path)"
['',
 '/home/vaibhav',
 '/usr/lib/python2.7/dist-packages',
 '/usr/lib/python2.7',
 '/usr/lib/python2.7/plat-x86_64-linux-gnu',
 '/usr/lib/python2.7/lib-tk',
 '/usr/lib/python2.7/lib-old',
 '/usr/lib/python2.7/lib-dynload',
 '/home/vaibhav/.local/lib/python2.7/site-packages',
 '/usr/local/lib/python2.7/dist-packages',
 '/usr/lib/python2.7/dist-packages/PILcompat',
 '/usr/lib/python2.7/dist-packages/gtk-2.0',
 '/usr/lib/pymodules/python2.7',
 '/usr/lib/python2.7/dist-packages/ubuntu-sso-client']

2.ここで言及されているリンクから参照を取得し、仮想環境で使用するか、クリーンなアナコンダを使用することに言及しました。それらのいずれも使用されておらず、既存の構成にどのように影響するかわかりません。

3.sudoを使用してPyhiveをインストールしたため、このリンクに従って権限を変更しましたが、それでも同じ問題が発生しました。

4

1 に答える 1

0

開始するファイルの名前はpyhive.py.

あなたがするとき

from pyhive import hive

内部では、ライブラリからではなくモジュールからpyhive.pyインポートしようとします。hivepyhive

開始するファイルに別の名前を付け、既存のモジュール/ライブラリの名前を使用しないようにしてください。

ドキュメントから:

spam という名前のモジュールがインポートされると、インタープリターは最初にその名前の組み込みモジュールを検索します。見つからない場合は、変数 sys.path で指定されたディレクトリのリストで spam.py という名前のファイルを検索します。sys.path は次の場所から初期化されます。

  • 入力スクリプトを含むディレクトリ (または現在のディレクトリ)。
  • PYTHONPATH (シェル変数 PATH と同じ構文のディレクトリ名のリスト)。
  • インストールに依存するデフォルト。
于 2017-06-25T09:12:33.407 に答える