web-dev-qa-db-ja.com

Python経由でHiveにアクセスする方法は?

https://cwiki.Apache.org/confluence/display/Hive/HiveClient#HiveClient-Python は古いようです。

これを/ etc/profileに追加すると:

export PYTHONPATH=$PYTHONPATH:/usr/lib/Hive/lib/py

from Hive import ThriftHiveを除いて、リンクにリストされているインポートを実行できます。

from Hive_service import ThriftHive

次に、この例のポートは10000でしたが、これを試みたときにプログラムがハングしました。デフォルトのHive Thriftポートは9083で、ハングを停止しました。

だから私はそれを次のように設定しました:

from thrift import Thrift
from thrift.transport import TSocket
from thrift.transport import TTransport
from thrift.protocol import TBinaryProtocol
try:
    transport = TSocket.TSocket('<node-with-metastore>', 9083)
    transport = TTransport.TBufferedTransport(transport)
    protocol = TBinaryProtocol.TBinaryProtocol(transport)
    client = ThriftHive.Client(protocol)
    transport.open()
    client.execute("CREATE TABLE test(c1 int)")

    transport.close()
except Thrift.TException, tx:
    print '%s' % (tx.message)

次のエラーが表示されました。

Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/usr/lib/Hive/lib/py/Hive_service/ThriftHive.py", line 68, in execute
self.recv_execute()
File "/usr/lib/Hive/lib/py/Hive_service/ThriftHive.py", line 84, in recv_execute
raise x
thrift.Thrift.TApplicationException: Invalid method name: 'execute'

ただし、ThriftHive.pyファイルを調べると、メソッドがClientクラス内で実行されていることがわかります。

Pythonを使用してHiveにアクセスするにはどうすればよいですか?

42
Matthew Moisen

最も簡単な方法はPyHiveを使用することだと思います。

インストールするには、これらのライブラリが必要です。

pip install sasl
pip install thrift
pip install thrift-sasl
pip install PyHive

ライブラリはPyHiveとしてインストールしますが、モジュールはすべて小文字のpyhiveとしてインポートします。

Linuxを使用している場合は、上記を実行する前にSASLを個別にインストールする必要があります。 apt-getまたはyum、またはディストリビューション用のパッケージマネージャーを使用して、libsasl2-devパッケージをインストールします。 Windowsの場合、GNU.orgにはいくつかのオプションがあり、バイナリインストーラーをダウンロードできます。 Macでは、Xcode開発者ツール(xcode-select --installをターミナルにインストールした場合)が利用可能になります。

インストール後、次のようにHiveに接続できます。

from pyhive import Hive
conn = Hive.Connection(Host="YOUR_Hive_Host", port=PORT, username="YOU")

Hive接続ができたので、それを使用するオプションがあります。単純なクエリを実行できます:

cursor = conn.cursor()
cursor.execute("SELECT cool_stuff FROM Hive_table")
for result in cursor.fetchall():
  use_result(result)

...または接続を使用してPandasデータフレームを作成するには:

import pandas as pd
df = pd.read_sql("SELECT cool_stuff FROM Hive_table", conn)
42
Tristan Reid

私はあなたがHiveServer2を使用していると断言します。これがコードを機能させない理由です。

Pyhs2を使用して、Hiveとそのようなサンプルコードに正しくアクセスできます。

import pyhs2

with pyhs2.connect(Host='localhost',
               port=10000,
               authMechanism="PLAIN",
               user='root',
               password='test',
               database='default') as conn:
    with conn.cursor() as cur:
        #Show databases
        print cur.getDatabases()

        #Execute query
        cur.execute("select * from table")

        #Return column info from query
        print cur.getSchema()

        #Fetch table results
        for i in cur.fetch():
            print i

Pyhs2をpipでインストールする前に、python-devel.x86_64 cyrus-sasl-devel.x86_64をインストールできることに注意してください。

これがあなたを助けることを願っています。

リファレンス: https://cwiki.Apache.org/confluence/display/Hive/Setting+Up+HiveServer2#SettingUpHiveServer2-PythonClientDriver

24
hustdelta

以下のpythonプログラムは、PythonからHiveテーブルにアクセスするために動作するはずです。

import commands

cmd = "Hive -S -e 'SELECT * FROM db_name.table_name LIMIT 1;' "

status, output = commands.getstatusoutput(cmd)

if status == 0:
   print output
else:
   print "error"
11
python-starter

Hiveライブラリを使用できます。Hiveimport ThriftHiveからHiveクラスをインポートするためです。

この例を試してください:

import sys

from Hive import ThriftHive
from Hive.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("CREATE TABLE r(a STRING, b INT, c DOUBLE)")
  client.execute("LOAD TABLE LOCAL INPATH '/path' INTO TABLE r")
  client.execute("SELECT * FROM r")
  while (1):
    row = client.fetchOne()
    if (row == None):
       break
    print row

  client.execute("SELECT * FROM r")
  print client.fetchAll()
  transport.close()
except Thrift.TException, tx:
  print '%s' % (tx.message)
6

ユーザー名/パスワードを使用してポートを指定して接続するには、コードは次のようになります。

from pyhive import presto

cursor = presto.connect(Host='Host.example.com',
                    port=8081,
                    username='USERNAME:PASSWORD').cursor()

sql = 'select * from table limit 10'

cursor.execute(sql)

print(cursor.fetchone())
print(cursor.fetchall())
5
Kurt Fehlhauer

pythonから複数のサーバー(SQL、Teradata、Hiveなど)に接続し続けるので、ここで簡単にできる一般的なアプローチを示します。したがって、pyodbcコネクターを使用します。 pyodbcを使用するための基本的な手順を次に示します(使用したことがない場合)。

  • 前提条件:次の手順を実行する前に、Windowsセットアップに関連するODBC接続が必要です。お持ちでない場合は、同じものを見つけてください here

完了したら:ステップ1. pip install:pip install pyodbcMicrosoftのWebサイトから関連するドライバーをダウンロードするためのリンクです

ステップ2.ここで、pythonスクリプトに同じものをインポートします。

import pyodbc

ステップ3.最後に、次のように接続の詳細を入力します。

conn_Hive = pyodbc.connect('DSN = YOUR_DSN_NAME , SERVER = YOUR_SERVER_NAME, UID = USER_ID, PWD = PSWD' )

Pyodbcを使用する最大の利点は、ほとんどすべてのデータソースに接続するために1つのパッケージのみをインポートする必要があることです。

4
Anand Vamsee

上記の例は少し時代遅れです。新しい例を次に示します。

import pyhs2 as Hive
import getpass
DEFAULT_DB = 'default'
DEFAULT_SERVER = '10.37.40.1'
DEFAULT_PORT = 10000
DEFAULT_DOMAIN = 'PAM01-PRD01.IBM.COM'

u = raw_input('Enter PAM username: ')
s = getpass.getpass()
connection = Hive.connect(Host=DEFAULT_SERVER, port= DEFAULT_PORT, authMechanism='LDAP', user=u + '@' + DEFAULT_DOMAIN, password=s)
statement = "select * from user_yuti.Temp_CredCard where pir_post_dt = '2014-05-01' limit 100"
cur = connection.cursor()

cur.execute(statement)
df = cur.fetchall() 

標準のpythonプログラムに加えて、PythonがHadoopデータベースへの接続を構築できるようにするために、いくつかのライブラリをインストールする必要があります。

1.Pyhs2、Python Hive Server 2クライアントドライバー

2. Python用のSasl、Cyrus-SASLバインディング

3.Thrift、Apache Thrift RPCシステムのPythonバインディング

4.PyHive、Python Hiveへのインターフェース

実行可能ファイルの許可を忘れずに変更してください

chmod + x test_Hive2.py ./test_Hive2.py

役に立てば幸いです。リファレンス: https://sites.google.com/site/tingyusz/home/blogs/hiveinpython

4
Ting Yu

ユーザーがクラスターノードにパッケージとライブラリをダウンロードしてインストールすることを禁止するのが一般的な方法です。この場合、Hiveが同じノードで実行されていれば、@ python-starterと@goksのソリューションは完璧に機能します。それ以外の場合は、beelineコマンドラインツールの代わりにHiveを使用できます。 詳細 を参照してください

#python 2
import commands

cmd = 'beeline -u "jdbc:Hive2://node07.foo.bar:10000/...<your connect string>" -e "SELECT * FROM db_name.table_name LIMIT 1;"'

status, output = commands.getstatusoutput(cmd)

if status == 0:
   print output
else:
   print "error"

#python 3
import subprocess

cmd = 'beeline -u "jdbc:Hive2://node07.foo.bar:10000/...<your connect string>" -e "SELECT * FROM db_name.table_name LIMIT 1;"'

status, output = subprocess.getstatusoutput(cmd)

if status == 0:
   print(output)
else:
   print("error")
3

@ python-starterソリューションに似ています。ただし、コマンドパッケージはpython 3.xでは使用できません。代替ソリューションは、Python 3.xでサブプロセスを使用することです

import subprocess

cmd = "Hive -S -e 'SELECT * FROM db_name.table_name LIMIT 1;' "

status, output = subprocess.getstatusoutput(cmd)

if status == 0:
   print(output)
else:
   print("error")
3
goks

Eycheuのソリューションに似ていますが、もう少し詳細です。

ここに代替ソリューションがあり、特にHive2に対してはPyHiveを必要としないまたはシステム全体のパッケージをインストールします。私はルートアクセス権がないLinux環境で作業しているので、Tristinの投稿で述べたSASL依存関係をインストールすることは私にとって選択肢ではありませんでした。

Linuxを使用している場合は、上記を実行する前にSASLを個別にインストールする必要があります。 apt-getまたはyumまたはディストリビューション用のパッケージマネージャーを使用して、libsasl2-devパッケージをインストールします。

特に、このソリューションはpythonパッケージの活用に焦点を当てています:JayDeBeApi。私の経験では、python Anaconda 2.7のインストールの上にこの1つの追加パッケージをインストールするだけで十分でした。このパッケージは、Java(JDK)を活用します。私はそれが既に設定されていると仮定しています。

ステップ1:JayDeBeApiをインストールする

pip install jaydebeap

ステップ2:環境に適したドライバーをダウンロードする

  • エンタープライズCDH環境に必要な jarへのリンク が必要です
  • 別の投稿 Apache Hiveのjdbcドライバーの検索場所について説明しています

すべての.jarファイルをディレクトリに保存します。このディレクトリを/ path/to/jar/files /と呼びます。

ステップ3:システム認証メカニズムを特定します:

リストされたpyhiveソリューションでは、認証メカニズムおよびKerberosとしてPLAINがリストされています。 jdbc接続URLは、使用している認証メカニズムに依存することに注意してください。説明しますKerberosソリューションユーザー名/パスワードを渡さずに。 詳細はKerberos認証とオプションです。

Kerberosチケットがまだ作成されていない場合は作成します

$ kinit

チケットはklistで表示できます。

これで、Pythonを介して接続する準備ができました。

import jaydebeapi
import glob
# Creates a list of jar files in the /path/to/jar/files/ directory
jar_files = glob.glob('/path/to/jar/files/*.jar')

Host='localhost'
port='10000'
database='default'

# note: your driver will depend on your environment and drivers you've
# downloaded in step 2
# this is the driver for my environment (jdbc3, Hive2, cloudera enterprise)
driver='com.cloudera.Hive.jdbc3.HS2Driver'

conn_Hive = jaydebeapi.connect(driver,
        'jdbc:Hive2://'+Host+':' +port+'/'+database+';AuthMech=1;KrbHostFQDN='+Host+';KrbServiceName=Hive'
                           ,jars=jar_files)

読むことだけが必要な場合は、eycheuのソリューションを使用して、簡単にパンダのデータフレームに直接読み込むことができます。

import pandas as pd
df = pd.read_sql("select * from table", conn_Hive)

それ以外の場合、より汎用性の高い通信オプションを次に示します。

cursor = conn_Hive.cursor()
sql_expression = "select * from table"
cursor.execute(sql_expression)
results = cursor.fetchall()

テーブルを作成したい場合、結果を「フェッチ」する必要はなく、代わりにテーブル作成クエリを送信できます。

3
joceratops

python JayDeBeApiパッケージを使用して、HiveまたはImpala JDBCドライバーからDB-API接続を作成し、接続をpandas.read_sql関数に渡して、pandasデータフレームでデータを返すことができます。

import jaydebeapi
# Apparently need to load the jar files for the first time for impala jdbc driver to work 
conn = jaydebeapi.connect('com.cloudera.Hive.jdbc41.HS2Driver',
['jdbc:Hive2://Host:10000/db;AuthMech=1;KrbHostFQDN=xxx.com;KrbServiceName=Hive;KrbRealm=xxx.COM', "",""],
jars=['/hadp/opt/jdbc/Hive_jdbc_2.5.18.1050/2.5.18.1050 GA/Cloudera_HiveJDBC41_2.5.18.1050/HiveJDBC41.jar',
'/hadp/opt/jdbc/Hive_jdbc_2.5.18.1050/2.5.18.1050 GA/Cloudera_HiveJDBC41_2.5.18.1050/TCLIServiceClient.jar',
'/hadp/opt/jdbc/Hive_jdbc_2.5.18.1050/2.5.18.1050 GA/Cloudera_HiveJDBC41_2.5.18.1050/commons-codec-1.3.jar',
'/hadp/opt/jdbc/Hive_jdbc_2.5.18.1050/2.5.18.1050 GA/Cloudera_HiveJDBC41_2.5.18.1050/commons-logging-1.1.1.jar',
'/hadp/opt/jdbc/Hive_jdbc_2.5.18.1050/2.5.18.1050 GA/Cloudera_HiveJDBC41_2.5.18.1050/Hive_metastore.jar',
'/hadp/opt/jdbc/Hive_jdbc_2.5.18.1050/2.5.18.1050 GA/Cloudera_HiveJDBC41_2.5.18.1050/Hive_service.jar',
'/hadp/opt/jdbc/Hive_jdbc_2.5.18.1050/2.5.18.1050 GA/Cloudera_HiveJDBC41_2.5.18.1050/httpclient-4.1.3.jar',
'/hadp/opt/jdbc/Hive_jdbc_2.5.18.1050/2.5.18.1050 GA/Cloudera_HiveJDBC41_2.5.18.1050/httpcore-4.1.3.jar',
'/hadp/opt/jdbc/Hive_jdbc_2.5.18.1050/2.5.18.1050 GA/Cloudera_HiveJDBC41_2.5.18.1050/libfb303-0.9.0.jar',
'/hadp/opt/jdbc/Hive_jdbc_2.5.18.1050/2.5.18.1050 GA/Cloudera_HiveJDBC41_2.5.18.1050/libthrift-0.9.0.jar',
'/hadp/opt/jdbc/Hive_jdbc_2.5.18.1050/2.5.18.1050 GA/Cloudera_HiveJDBC41_2.5.18.1050/log4j-1.2.14.jar',
'/hadp/opt/jdbc/Hive_jdbc_2.5.18.1050/2.5.18.1050 GA/Cloudera_HiveJDBC41_2.5.18.1050/ql.jar',
'/hadp/opt/jdbc/Hive_jdbc_2.5.18.1050/2.5.18.1050 GA/Cloudera_HiveJDBC41_2.5.18.1050/slf4j-api-1.5.11.jar',
'/hadp/opt/jdbc/Hive_jdbc_2.5.18.1050/2.5.18.1050 GA/Cloudera_HiveJDBC41_2.5.18.1050/slf4j-log4j12-1.5.11.jar',
'/hadp/opt/jdbc/Hive_jdbc_2.5.18.1050/2.5.18.1050 GA/Cloudera_HiveJDBC41_2.5.18.1050/zookeeper-3.4.6.jar',
'/hadp/opt/jdbc/impala_jdbc_2.5.35/2.5.35.1055 GA/Cloudera_ImpalaJDBC41_2.5.35/ImpalaJDBC41.jar',
'/hadp/opt/jdbc/impala_jdbc_2.5.35/2.5.35.1055 GA/Cloudera_ImpalaJDBC41_2.5.35/TCLIServiceClient.jar',
'/hadp/opt/jdbc/impala_jdbc_2.5.35/2.5.35.1055 GA/Cloudera_ImpalaJDBC41_2.5.35/commons-codec-1.3.jar',
'/hadp/opt/jdbc/impala_jdbc_2.5.35/2.5.35.1055 GA/Cloudera_ImpalaJDBC41_2.5.35/commons-logging-1.1.1.jar',
'/hadp/opt/jdbc/impala_jdbc_2.5.35/2.5.35.1055 GA/Cloudera_ImpalaJDBC41_2.5.35/Hive_metastore.jar',
'/hadp/opt/jdbc/impala_jdbc_2.5.35/2.5.35.1055 GA/Cloudera_ImpalaJDBC41_2.5.35/Hive_service.jar',
'/hadp/opt/jdbc/impala_jdbc_2.5.35/2.5.35.1055 GA/Cloudera_ImpalaJDBC41_2.5.35/httpclient-4.1.3.jar',
'/hadp/opt/jdbc/impala_jdbc_2.5.35/2.5.35.1055 GA/Cloudera_ImpalaJDBC41_2.5.35/httpcore-4.1.3.jar',
'/hadp/opt/jdbc/impala_jdbc_2.5.35/2.5.35.1055 GA/Cloudera_ImpalaJDBC41_2.5.35/libfb303-0.9.0.jar',
'/hadp/opt/jdbc/impala_jdbc_2.5.35/2.5.35.1055 GA/Cloudera_ImpalaJDBC41_2.5.35/libthrift-0.9.0.jar',
'/hadp/opt/jdbc/impala_jdbc_2.5.35/2.5.35.1055 GA/Cloudera_ImpalaJDBC41_2.5.35/log4j-1.2.14.jar',
'/hadp/opt/jdbc/impala_jdbc_2.5.35/2.5.35.1055 GA/Cloudera_ImpalaJDBC41_2.5.35/ql.jar',
'/hadp/opt/jdbc/impala_jdbc_2.5.35/2.5.35.1055 GA/Cloudera_ImpalaJDBC41_2.5.35/slf4j-api-1.5.11.jar',
'/hadp/opt/jdbc/impala_jdbc_2.5.35/2.5.35.1055 GA/Cloudera_ImpalaJDBC41_2.5.35/slf4j-log4j12-1.5.11.jar',
'/hadp/opt/jdbc/impala_jdbc_2.5.35/2.5.35.1055 GA/Cloudera_ImpalaJDBC41_2.5.35/zookeeper-3.4.6.jar'
])

# the previous call have initialized the jar files, technically this call needs not include the required jar files
impala_conn = jaydebeapi.connect('com.cloudera.impala.jdbc41.Driver',
['jdbc:impala://Host:21050/db;AuthMech=1;KrbHostFQDN=xxx.com;KrbServiceName=impala;KrbRealm=xxx.COM',"",""],
jars=['/hadp/opt/jdbc/Hive_jdbc_2.5.18.1050/2.5.18.1050 GA/Cloudera_HiveJDBC41_2.5.18.1050/HiveJDBC41.jar',
'/hadp/opt/jdbc/Hive_jdbc_2.5.18.1050/2.5.18.1050 GA/Cloudera_HiveJDBC41_2.5.18.1050/TCLIServiceClient.jar',
'/hadp/opt/jdbc/Hive_jdbc_2.5.18.1050/2.5.18.1050 GA/Cloudera_HiveJDBC41_2.5.18.1050/commons-codec-1.3.jar',
'/hadp/opt/jdbc/Hive_jdbc_2.5.18.1050/2.5.18.1050 GA/Cloudera_HiveJDBC41_2.5.18.1050/commons-logging-1.1.1.jar',
'/hadp/opt/jdbc/Hive_jdbc_2.5.18.1050/2.5.18.1050 GA/Cloudera_HiveJDBC41_2.5.18.1050/Hive_metastore.jar',
'/hadp/opt/jdbc/Hive_jdbc_2.5.18.1050/2.5.18.1050 GA/Cloudera_HiveJDBC41_2.5.18.1050/Hive_service.jar',
'/hadp/opt/jdbc/Hive_jdbc_2.5.18.1050/2.5.18.1050 GA/Cloudera_HiveJDBC41_2.5.18.1050/httpclient-4.1.3.jar',
'/hadp/opt/jdbc/Hive_jdbc_2.5.18.1050/2.5.18.1050 GA/Cloudera_HiveJDBC41_2.5.18.1050/httpcore-4.1.3.jar',
'/hadp/opt/jdbc/Hive_jdbc_2.5.18.1050/2.5.18.1050 GA/Cloudera_HiveJDBC41_2.5.18.1050/libfb303-0.9.0.jar',
'/hadp/opt/jdbc/Hive_jdbc_2.5.18.1050/2.5.18.1050 GA/Cloudera_HiveJDBC41_2.5.18.1050/libthrift-0.9.0.jar',
'/hadp/opt/jdbc/Hive_jdbc_2.5.18.1050/2.5.18.1050 GA/Cloudera_HiveJDBC41_2.5.18.1050/log4j-1.2.14.jar',
'/hadp/opt/jdbc/Hive_jdbc_2.5.18.1050/2.5.18.1050 GA/Cloudera_HiveJDBC41_2.5.18.1050/ql.jar',
'/hadp/opt/jdbc/Hive_jdbc_2.5.18.1050/2.5.18.1050 GA/Cloudera_HiveJDBC41_2.5.18.1050/slf4j-api-1.5.11.jar',
'/hadp/opt/jdbc/Hive_jdbc_2.5.18.1050/2.5.18.1050 GA/Cloudera_HiveJDBC41_2.5.18.1050/slf4j-log4j12-1.5.11.jar',
'/hadp/opt/jdbc/Hive_jdbc_2.5.18.1050/2.5.18.1050 GA/Cloudera_HiveJDBC41_2.5.18.1050/zookeeper-3.4.6.jar',
'/hadp/opt/jdbc/impala_jdbc_2.5.35/2.5.35.1055 GA/Cloudera_ImpalaJDBC41_2.5.35/ImpalaJDBC41.jar',
'/hadp/opt/jdbc/impala_jdbc_2.5.35/2.5.35.1055 GA/Cloudera_ImpalaJDBC41_2.5.35/TCLIServiceClient.jar',
'/hadp/opt/jdbc/impala_jdbc_2.5.35/2.5.35.1055 GA/Cloudera_ImpalaJDBC41_2.5.35/commons-codec-1.3.jar',
'/hadp/opt/jdbc/impala_jdbc_2.5.35/2.5.35.1055 GA/Cloudera_ImpalaJDBC41_2.5.35/commons-logging-1.1.1.jar',
'/hadp/opt/jdbc/impala_jdbc_2.5.35/2.5.35.1055 GA/Cloudera_ImpalaJDBC41_2.5.35/Hive_metastore.jar',
'/hadp/opt/jdbc/impala_jdbc_2.5.35/2.5.35.1055 GA/Cloudera_ImpalaJDBC41_2.5.35/Hive_service.jar',
'/hadp/opt/jdbc/impala_jdbc_2.5.35/2.5.35.1055 GA/Cloudera_ImpalaJDBC41_2.5.35/httpclient-4.1.3.jar',
'/hadp/opt/jdbc/impala_jdbc_2.5.35/2.5.35.1055 GA/Cloudera_ImpalaJDBC41_2.5.35/httpcore-4.1.3.jar',
'/hadp/opt/jdbc/impala_jdbc_2.5.35/2.5.35.1055 GA/Cloudera_ImpalaJDBC41_2.5.35/libfb303-0.9.0.jar',
'/hadp/opt/jdbc/impala_jdbc_2.5.35/2.5.35.1055 GA/Cloudera_ImpalaJDBC41_2.5.35/libthrift-0.9.0.jar',
'/hadp/opt/jdbc/impala_jdbc_2.5.35/2.5.35.1055 GA/Cloudera_ImpalaJDBC41_2.5.35/log4j-1.2.14.jar',
'/hadp/opt/jdbc/impala_jdbc_2.5.35/2.5.35.1055 GA/Cloudera_ImpalaJDBC41_2.5.35/ql.jar',
'/hadp/opt/jdbc/impala_jdbc_2.5.35/2.5.35.1055 GA/Cloudera_ImpalaJDBC41_2.5.35/slf4j-api-1.5.11.jar',
'/hadp/opt/jdbc/impala_jdbc_2.5.35/2.5.35.1055 GA/Cloudera_ImpalaJDBC41_2.5.35/slf4j-log4j12-1.5.11.jar',
'/hadp/opt/jdbc/impala_jdbc_2.5.35/2.5.35.1055 GA/Cloudera_ImpalaJDBC41_2.5.35/zookeeper-3.4.6.jar'
])

import pandas as pd
df1 = pd.read_sql("SELECT * FROM tablename", conn)
df2 = pd.read_sql("SELECT * FROM tablename", impala_conn)

conn.close()
impala_conn.close()
2
eycheu

pyhs2は維持されなくなりました。より良い代替はimpylaです

Impalaに関する上記の例の一部と混同しないでください。 HiveServer2のポートを10000(デフォルト)に変更するだけで、Impalaの例と同じように機能します。 ImpalaとHiveの両方に使用されるのと同じプロトコル(Thrift)です。

https://github.com/cloudera/impyla

Pyhs2よりも多くの機能があります。たとえば、Kerberos認証があります。これは私たちにとって必須です。

from impala.dbapi import connect
conn = connect(Host='my.Host.com', port=10000)
cursor = conn.cursor()
cursor.execute('SELECT * FROM mytable LIMIT 100')
print cursor.description  # prints the result set's schema
results = cursor.fetchall()

##
cursor.execute('SELECT * FROM mytable LIMIT 100')
for row in cursor:
    process(row)

Clouderaはhs2クライアントにさらに力を入れています https://github.com/cloudera/hs2client これはC/C++ HiveServer2/Impalaクライアントです。大量のデータをPythonに送信したり、Pythonから送信したりする場合は、より適切なオプションになる可能性があります。 (Pythonバインディングもあります- https://github.com/cloudera/hs2client/tree/master/python

Impylaに関するいくつかの詳細情報:

2
Tagar

これは、Hiveとpythonを接続するための簡単なハックになります。

from pyhive import Hive
cursor = Hive.connect('YOUR_Host_NAME').cursor()
cursor.execute('SELECT * from table_name LIMIT 5',async=True)
print cursor.fetchall()

出力:タプルのリスト

Pythonクライアントドライバーを使用する

pip install pyhs2

それから

import pyhs2

with pyhs2.connect(Host='localhost',
               port=10000,
               authMechanism="PLAIN",
               user='root',
               password='test',
               database='default') as conn:
with conn.cursor() as cur:
    #Show databases
    print cur.getDatabases()

    #Execute query
    cur.execute("select * from table")

    #Return column info from query
    print cur.getSchema()

    #Fetch table results
    for i in cur.fetch():
        print i

参照: https://cwiki.Apache.org/confluence/display/Hive/Setting+Up+HiveServer2#SettingUpHiveServer2-PythonClientDriver

0
Saran Pal

私はあなたと同じ問題を解決しました、ここに私の動作環境があります(システム:linuxバージョン:python 3.6パッケージ:Pyhive)次のように私の答えを参照してください:

from pyhive import Hive
conn = Hive.Connection(Host='149.129.***.**', port=10000, username='*', database='*',password="*",auth='LDAP')

重要なポイントは、参照パスワードと認証を追加し、その間に認証を「LDAP」に設定することです。その後、それはうまく機能し、質問があれば私に知らせてください

0
lezaimemecha