web-dev-qa-db-fra.com

Comment accéder à Hive via Python?

https://cwiki.Apache.org/confluence/display/Hive/HiveClient#HiveClient-Python semble être obsolète.

Quand j'ajoute ceci à/etc/profile:

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

Je peux ensuite effectuer les importations répertoriées dans le lien, à l'exception de from Hive import ThriftHive qui doit en réalité être:

from Hive_service import ThriftHive

Dans l'exemple suivant, le port était 10000, ce qui, lorsque j'ai essayé, a provoqué le blocage du programme. Le port par défaut Hive Thrift est 9083, ce qui a arrêté la suspension.

Alors je l'ai configuré comme suit:

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)

J'ai reçu l'erreur suivante:

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'

Mais l'inspection du fichier ThriftHive.py révèle que la méthode est exécutée dans la classe Client.

Comment utiliser Python pour accéder à Hive?

37
Matthew Moisen

Je pense que le moyen le plus simple est d'utiliser PyHive.

Pour installer, vous aurez besoin de ces bibliothèques:

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

Veuillez noter que même si vous installez la bibliothèque en tant que PyHive, vous importez le module en tant que pyhive, tous en minuscules.

Si vous êtes sous Linux, vous devrez peut-être installer SASL séparément avant d'exécuter ce qui précède. Installez le paquet libsasl2-dev en utilisant apt-get ou yum ou n’importe quel gestionnaire de paquet pour votre distribution. Pour Windows, il existe quelques options sur GNU.org, vous pouvez télécharger un programme d’installation binaire. Sur un Mac, SASL devrait être disponible si vous avez installé les outils de développement xcode (xcode-select --install dans Terminal).

Après l'installation, vous pouvez vous connecter à Hive comme ceci:

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

Maintenant que vous avez la connexion Hive, vous avez des options pour l’utiliser. Vous pouvez juste requête directement:

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

... ou d'utiliser la connexion pour créer un cadre de données Pandas:

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

J'affirme que vous utilisez HiveServer2, ce qui explique pourquoi le code ne fonctionne pas.

Vous pouvez utiliser pyhs2 pour accéder correctement à votre ruche et à l'exemple de code suivant:

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

Attention, vous pouvez installer python-devel.x86_64 avant d’installer pyhs2 avec pip. Cyrus-sasl-devel.x86_64.

Souhaitez que cela puisse vous aider.

Référence: https://cwiki.Apache.org/confluence/display/Hive/Setting+Up+HiveServer2#SettingUpHiveServer2-PythonClientDriver

23
hustdelta

Le programme ci-dessous devrait fonctionner pour accéder aux tables Hive à partir de python:

    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

Vous pouvez utiliser la bibliothèque Hive pour importer la classe Hive de Hive import ThriftHive

Essayez cet exemple:

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
Naveen Subramani

Pour vous connecter avec un nom d'utilisateur/mot de passe et en spécifiant les ports, le code se présente comme suit:

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

Les exemples ci-dessus sont un peu dépassés. Un nouvel exemple est ici: 

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

En plus du programme standard Python, quelques bibliothèques doivent être installées pour permettre à Python de créer la connexion au databae Hadoop.

1.Pyhs2, pilote client Python Hive Server 2

Liaisons 2.Sasl, Cyrus-SASL pour Python

Liaisons 3.Trift, Python pour le système Apache Thrift RPC

4.PyHive, interface Python vers Hive

N'oubliez pas de changer la permission de l'exécutable

chmod + x test_Hive2.py ./test_Hive2.py

J'aimerais que ça vous aide. Référence: https://sites.google.com/site/tingyusz/home/blogs/hiveinpython

4
Ting Yu

Il est courant d'empêcher l'utilisateur de télécharger et d'installer des packages et des bibliothèques sur des nœuds de cluster. Dans ce cas, les solutions @ python-starter et @goks fonctionnent parfaitement si Hive est exécuté sur le même noeud. Sinon, vous pouvez utiliser un outil beeline au lieu de Hive. Voir détails

#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
Oleg Svechkarenko

semblable à la solution @ python-starter. Cependant, le paquet de commandes n'est pas disponible sur python3.x. Donc, la solution alternative consiste à utiliser un sous-processus dans 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

Semblable à la solution eycheu, mais un peu plus détaillé.

Voici une solution alternative spécifiquement pour Hive2 qui ne nécessite pas PyHive ou l'installation de packages à l'échelle du système. Je travaille sur un environnement Linux auquel je n'ai pas accès root, donc installer les dépendances SASL comme mentionné dans le message de Tristin n'était pas une option pour moi:

Si vous êtes sous Linux, vous devrez peut-être installer SASL séparément avant d'exécuter ce qui précède. Installez le paquet libsasl2-dev en utilisant apt-get ou yum ou n’importe quel gestionnaire de paquet pour votre distribution. 

Plus précisément, cette solution vise à tirer parti du package python: JayDeBeApi. D'après mon expérience, l'installation de ce paquet supplémentaire sur une installation Anaconda 2.7 python était tout ce dont j'avais besoin. Ce paquet tire parti de Java (JDK). Je suppose que c'est déjà mis en place.

Étape 1: Installez JayDeBeApi

pip install jaydebeap

Étape 2: Téléchargez les pilotes appropriés pour votre environnement:

Stocker tous les fichiers .jar dans un répertoire. Je ferai référence à ce répertoire sous le nom/path/to/jar/files /.

Étape 3: Identifiez le mécanisme d’authentification de votre système:

Dans les solutions pyhive répertoriées, j'ai vu PLAIN répertorié comme mécanisme d'authentification, ainsi que Kerberos. Notez que votre URL de connexion jdbc dépendra du mécanisme d'authentification que vous utilisez. Je vais expliquer la solution Kerberos sans indiquer de nom d'utilisateur/mot de passe. Voici plus d'informations sur l'authentification Kerberos et ses options.

Créer un ticket Kerberos s'il n'en a pas déjà été créé

$ kinit

Les billets peuvent être consultés via klist

Vous êtes maintenant prêt à établir la connexion via 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)

Si vous ne vous souciez que de la lecture, vous pouvez le lire directement dans la base de données d'un panda facilement via la solution eycheu:

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

Sinon, voici une option de communication plus polyvalente:

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

Vous pouvez imaginer que si vous souhaitez créer une table, vous n'avez pas besoin de "récupérer" les résultats, mais vous pouvez plutôt soumettre une requête de création de table. 

3
joceratops

pyhs2 n'est plus maintenu. Une meilleure alternative est l'impyla

Ne soyez pas confus que certains des exemples ci-dessous concernant Impala; changez simplement le port en 10000 (valeur par défaut) pour HiveServer2, et cela fonctionnera de la même manière qu'avec les exemples Impala. C'est le même protocole (Thrift) qui est utilisé pour Impala et Hive.

https://github.com/cloudera/impyla

Il a beaucoup plus de fonctionnalités que pyhs2, par exemple, il a l’authentification Kerberos, ce qui est une nécessité pour nous.

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 met plus d'effort maintenant sur le client hs2 https://github.com/cloudera/hs2client Qui est un client C/C++ HiveServer2/Impala. Cela pourrait être une meilleure option si vous transmettez beaucoup de données vers/depuis python. (a également une liaison Python - https://github.com/cloudera/hs2client/tree/master/python )

Quelques informations supplémentaires sur impyla:

2
Tagar

Cela peut être un hack rapide pour connecter Hive et 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()

Sortie: Liste des tuples

2

Vous pouvez utiliser le package JayDeBeApi python pour créer une connexion DB-API à partir du pilote JDBC Hive ou Impala, puis transmettre la connexion à la fonction pandas.read_sql pour renvoyer des données dans le cadre de données 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()
1
eycheu

voici une approche générique qui me facilite la tâche car je continue à me connecter à plusieurs serveurs (SQL, Teradata, Hive, etc.) à partir de python. Par conséquent, j'utilise le connecteur pyodbc. Voici quelques étapes élémentaires pour commencer à utiliser pyodbc (si vous ne l'avez jamais utilisé): 

  • Pré-requis: vous devez avoir la connexion ODBC appropriée dans votre configuration Windows avant de suivre les étapes ci-dessous. Si vous ne l'avez pas, trouvez le même ici

Une fois terminé: ÉTAPE 1. pip installer: pip install pyodbc ( voici le lien pour télécharger le pilote correspondant depuis le site Web de Microsoft )

ÉTAPE 2. Maintenant, importez la même chose dans votre script python: 

import pyodbc

ÉTAPE 3. Enfin, continuez et donnez les détails de la connexion comme suit: 

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

La meilleure partie de l'utilisation de pyodbc est que je dois importer un seul package pour me connecter à presque toutes les sources de données. 

1
Anand Vamsee

En utilisant le pilote client Python

pip install pyhs2

Ensuite

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

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

0
Saran Pal

J'ai résolu le même problème avec vous , voici mon environnement d'exploitation ( Système: linux Versions: python 3.6 Paquet: Pyhive) Veuillez vous référer à ma réponse comme suit:

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

Le point clé est d’ajouter le mot de passe de référence & auth et de définir l’authentification sur 'LDAP'. Ensuite, cela fonctionne bien, toutes les questions s'il vous plaît laissez-moi savoir

0
lezaimemecha