it-swarm.com.de

Wie kann ich über Python auf Hive zugreifen?

https://cwiki.Apache.org/confluence/display/Hive/HiveClient#HiveClient-Python scheint veraltet zu sein.

Wenn ich dies zu/etc/profile hinzufüge:

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

Ich kann dann die Importe wie im Link aufgeführt ausführen, mit Ausnahme von from Hive import ThriftHive, das eigentlich sein muss:

from Hive_service import ThriftHive

Als nächstes war der Port in dem Beispiel 10000, was bei meinem Versuch das Programm zum Erliegen brachte. Der Standardport von Hive Thrift ist 9083, wodurch das Aufhängen beendet wurde.

Also habe ich es so eingerichtet:

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)

Ich habe folgenden Fehler erhalten:

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'

Bei der Untersuchung der ThriftHive.py-Datei wird jedoch die Ausführung der Methode innerhalb der Client-Klasse angezeigt.

Wie kann ich Python verwenden, um auf Hive zuzugreifen?

37
Matthew Moisen

Ich glaube, der einfachste Weg ist die Verwendung von PyHive.

Zur Installation benötigen Sie folgende Bibliotheken:

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

Beachten Sie, dass Sie die Bibliothek zwar als PyHive installieren, das Modul jedoch als pyhive importieren, alles in Kleinschreibung.

Wenn Sie mit Linux arbeiten, müssen Sie SASL möglicherweise separat installieren, bevor Sie die obigen Schritte ausführen. Installieren Sie das Paket libsasl2-dev mit apt-get oder yum oder einem anderen Paketmanager für Ihre Distribution. Für Windows gibt es einige Optionen auf GNU.org. Sie können ein binäres Installationsprogramm herunterladen. Auf einem Mac sollte SASL verfügbar sein, wenn Sie Xcode Developer Tools installiert haben (xcode-select --install in Terminal).

Nach der Installation können Sie wie folgt eine Verbindung zu Hive herstellen:

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

Nun, da Sie über die Hive-Verbindung verfügen, haben Sie Optionen zur Verwendung. Sie können einfach eine direkte Abfrage durchführen:

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

... oder um die Verbindung zum Erstellen eines Pandas-Datenrahmens zu verwenden:

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

Ich behaupte, dass Sie HiveServer2 verwenden. Aus diesem Grund funktioniert der Code nicht.

Sie können pyhs2 verwenden, um korrekt auf Ihre Hive zuzugreifen, und den Beispielcode wie folgt:

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

Achtung, Sie können python-devel.x86_64 cyrus-sasl-devel.x86_64 installieren, bevor Sie pyhs2 mit pip installieren.

Ich wünschte das kann dir helfen.

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

23
hustdelta

Das folgende Python-Programm sollte funktionieren, um auf Hive-Tabellen von Python aus zuzugreifen:

    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"
13
python-starter

Sie können die Hive-Bibliothek verwenden, für die Sie die Hive-Klasse aus Hive-Import ThriftHive importieren möchten

Versuchen Sie dieses Beispiel:

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

Um sich mit einem Benutzernamen/Passwort zu verbinden und Ports anzugeben, sieht der Code folgendermaßen aus:

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

Die obigen Beispiele sind etwas veraltet. Ein neues Beispiel ist hier: 

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() 

Zusätzlich zum Standard-Python-Programm müssen einige Bibliotheken installiert werden, damit Python die Verbindung zur Hadoop-Datenbank herstellen kann.

1.Pyhs2, Python Hive Server 2-Clienttreiber

2.Sasl, Cyrus-SASL-Bindungen für Python

3. Thrift, Python-Bindungen für das Apache Thrift-RPC-System

4.PyHive, Python-Schnittstelle zu Hive

Denken Sie daran, die Erlaubnis der ausführbaren Datei zu ändern

chmod + x test_Hive2.py ./test_Hive2.py

Ich wünschte, es hilft dir. Referenz: https://sites.google.com/site/tingyusz/home/blogs/hiveinpython

4
Ting Yu

Es ist üblich, Benutzern das Herunterladen und Installieren von Paketen und Bibliotheken auf Clusterknoten zu verbieten. In diesem Fall funktionieren die Lösungen von @ python-starter und @goks perfekt, wenn Hive auf demselben Knoten ausgeführt wird. Andernfalls kann anstelle von beeline ein Befehlszeilentool Hive verwendet werden. Siehe Details

#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

ähnlich der @ Python-Starter-Lösung. Das Befehlspaket ist jedoch nicht in python3.x verfügbar. Alternative Lösung ist die Verwendung eines Unterprozesses in python3.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

Ähnlich wie die Lösung von eycheu, aber etwas detaillierter.

Hier ist eine alternative Lösung speziell für Hive2, für die PyHive nicht erforderlich ist oder systemweite Pakete installiert werden. Ich arbeite an einer Linux-Umgebung, auf die ich keinen Root-Zugriff habe. Die Installation der SASL-Abhängigkeiten, wie in Tristins Beitrag erwähnt, war für mich keine Option:

Wenn Sie mit Linux arbeiten, müssen Sie SASL möglicherweise separat installieren, bevor Sie die obigen Schritte ausführen. Installieren Sie das Paket libsasl2-dev mit apt-get oder yum oder einem anderen Paketmanager für Ihre Distribution. 

Diese Lösung konzentriert sich insbesondere auf die Nutzung des Python-Pakets: JayDeBeApi. Nach meiner Erfahrung war die Installation dieses zusätzlichen Pakets zusätzlich zu einer Python-Installation von Anaconda 2.7 alles, was ich brauchte. Dieses Paket nutzt Java (JDK). Ich gehe davon aus, dass das bereits eingerichtet ist.

Schritt 1: JayDeBeApi installieren

pip install jaydebeap

Schritt 2: Laden Sie geeignete Treiber für Ihre Umgebung herunter:

Speichern Sie alle JAR-Dateien in einem Verzeichnis. Ich werde dieses Verzeichnis als/path/to/jar/files/bezeichnen.

Schritt 3: Identifizieren Sie Ihren Systemauthentifizierungsmechanismus:

In den aufgeführten Pyhive-Lösungen habe ich PLAIN als Authentifizierungsmechanismus sowie Kerberos aufgeführt. Beachten Sie, dass Ihre jdbc-Verbindungs-URL von dem verwendeten Authentifizierungsmechanismus abhängt. Ich erkläre Kerberos-Lösung, ohne einen Benutzernamen/ein Kennwort zu übergeben. Hier finden Sie weitere Informationen zur Kerberos-Authentifizierung und Optionen.

Kerberos-Ticket erstellen, falls noch nicht erstellt wurde

$ kinit

Tickets können über klist eingesehen werden. 

Sie können jetzt die Verbindung über Python herstellen:

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)

Wenn Sie sich nur für das Lesen interessieren, können Sie es einfach mit eycheus Lösung direkt in den Datenrahmen eines Pandas einlesen:

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

Ansonsten ist hier eine vielseitigere Kommunikationsmöglichkeit:

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

Sie können sich vorstellen, dass Sie beim Erstellen einer Tabelle die Ergebnisse nicht "abrufen" müssen, sondern stattdessen eine Tabelle zum Erstellen von Tabellen einreichen können. 

3
joceratops

pyhs2 wird nicht mehr gepflegt. Eine bessere Alternative ist Impyla

Seien Sie nicht verwirrt, dass einige der obigen Beispiele über Impala unten sind. Ändern Sie einfach den Port auf 10000 (Standard) für HiveServer2, und es funktioniert genauso wie bei Impala-Beispielen. Es ist das gleiche Protokoll (Thrift), das sowohl für Impala als auch für Hive verwendet wird.

https://github.com/cloudera/impyla

Es hat viel mehr Funktionen als pyhs2, zum Beispiel hat es die Kerberos-Authentifizierung, was für uns ein Muss ist.

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 bemüht sich jetzt mehr um den hs2-Client https://github.com/cloudera/hs2client . Dies ist ein C/C++ HiveServer2/Impala-Client. Könnte eine bessere Option sein, wenn Sie eine Menge Daten zu/von Python übertragen. (hat auch Python-Bindung - https://github.com/cloudera/hs2client/tree/master/python )

Weitere Informationen zu Impyla:

2
Tagar

Dies kann ein schneller Hack sein, um Hive und Python zu verbinden

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

Ausgabe: Liste der Tupel

Sie können das python-JayDeBeApi-Paket verwenden, um eine DB-API-Verbindung vom Hive- oder Impala-JDBC-Treiber zu erstellen, und dann die Verbindung an die Funktion pandas.read_sql übergeben, um Daten in einem Pandas-Datenframe zurückzugeben.

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()
1
eycheu

hier ist ein generischer Ansatz, der es mir leicht macht, weil ich ständig Verbindungen zu mehreren Servern (SQL, Teradata, Hive usw.) von Python her aufstelle. Daher benutze ich den Pyodbc-Connector. Hier sind einige grundlegende Schritte, um mit pyodbc zu beginnen (falls Sie es noch nie benutzt haben): 

  • Voraussetzung: Sie sollten die entsprechende ODBC -Verbindung in Ihrem Windows-Setup haben, bevor Sie die folgenden Schritte ausführen. Falls Sie es nicht haben, finden Sie dasselbe hier

Nach Abschluss der Installation: SCHRITT 1. pip-Installation: pip install pyodbc ( hier ist der Link zum Herunterladen des entsprechenden Treibers von der Microsoft-Website )

SCHRITT 2. Nun importieren Sie dasselbe in Ihr Python-Skript: 

import pyodbc

SCHRITT 3. Abschließend geben Sie die Verbindungsdetails wie folgt an: 

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

Der beste Teil der Verwendung von pyodbc ist, dass ich nur ein Paket importieren muss, um eine Verbindung zu fast jeder Datenquelle herzustellen. 

1
Anand Vamsee

Mit dem Python-Client-Treiber

pip install pyhs2

Dann

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

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

0
Saran Pal

Ich habe das gleiche Problem mit Ihnen gelöst. Hier ist meine Betriebsumgebung ( System: Linux Versionen: Python 3.6 Paket: Pyhive).

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

Der Schlüsselpunkt ist das Hinzufügen des Referenzkennworts & auth, und setzen Sie unterdessen die Authentifizierung auf 'LDAP'. Dann funktioniert es gut, bitte lassen Sie es mich wissen

0
lezaimemecha