1
votes

Utilisation de Python pour se connecter à la base de données Impala (erreur Thriftpy)

Ce que j'essaie de faire est très basique: me connecter à une base de données Impala en utilisant Python:

Traceback (most recent call last):
  File "/usr/local/lib/python3.6/dist-packages/thriftpy/transport/socket.py", line 96, in open
    self.sock.connect(addr)
socket.gaierror: [Errno -3] Temporary failure in name resolution

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "/home/alaaeddine/PycharmProjects/test/data_test.py", line 3, in <module>
    conn = connect(host='impala', port=21050, auth_mechanism='PLAIN')
  File "/usr/local/lib/python3.6/dist-packages/impala/dbapi.py", line 147, in connect
    auth_mechanism=auth_mechanism)
  File "/usr/local/lib/python3.6/dist-packages/impala/hiveserver2.py", line 758, in connect
    transport.open()
  File "/usr/local/lib/python3.6/dist-packages/thrift_sasl/__init__.py", line 61, in open
    self._trans.open()
  File "/usr/local/lib/python3.6/dist-packages/thriftpy/transport/socket.py", line 104, in open
    message="Could not connect to %s" % str(addr))
thriftpy.transport.TTransportException: TTransportException(type=1, message="Could not connect to ('impala', 21050)")

J'utilise le package Impyla pour ce faire. J'ai eu cette erreur:

from impala.dbapi import connect

conn = connect(host='impala', port=21050, auth_mechanism='PLAIN')

J'ai également essayé le package Ibis, mais j'ai échoué avec la même erreur liée à l'économie.

Sous Windows utilisant Dbeaver, je pouvais me connecter à la base de données en utilisant le connecteur JDBC officiel Cloudera. Mes questions sont:

  • Dois-je passer mon connecteur JDBC comme paramètre dans mon code de connexion? J'ai fait une recherche, je n'ai pas trouvé quelque chose indiquant cette direction.
  • Dois-je essayer autre chose que les forfaits Ibis et Impyla? J'avais rencontré de nombreux problèmes et dépendances liés aux versions lors de leur utilisation. Si oui, quelles alternatives recommanderiez-vous?

Merci !


0 commentaires

3 Réponses :


0
votes

Résolu: J'ai utilisé le package pyhive au lieu d'Ibis / Impyla. Voici un exemple:

#import hive from pyhive
from pyhive import hive

#establish the connection to the db
conn = hive.Connection(host='host_IP_addr', port='conn_port', auth='auth_type', database='my_db')

#prepare the cursor for the queries
cursor = conn.cursor()

#execute a query
cursor.execute("SHOW TABLES")

#navigate and display the results 
for table in cursor.fetchall():
    print(table)


0 commentaires

0
votes

Votre nom de domaine impala ne doit pas être résolu. Êtes-vous capable de faire nslookup impala dans l'invite de commande? Si vous utilisez Docker, vous devez avoir le nom du service docker dans docker-compose comme "impala" ou avoir l'option "extra_hosts". Ou vous pouvez toujours l'ajouter à / etc / hosts (Windows / Drivers / etc / hosts) en tant que impala 127.0.0.1

Essayez également «NOSASL» au lieu de PLAIN parfois qui fonctionne mieux avec la sécurité désactivée.


0 commentaires

0
votes

C'est la méthode simple, connecter impala via le shell impala en utilisant python.

    import commands
    import re
    query1 = "select * from table_name limit 10"
    impalad = str('hostname')
    port = str('21000')
    database = str('database_name')
    result_string = 'impala-shell -i "'+ impalad+':'+port +'" -k -B --delimited -q "'+query1+'"' 
    status, output = commands.getstatusoutput(result_string)
    print output
    if status == 0:
            print output
    else:
            print "Error encountered while executing HiveQL queries."


0 commentaires