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:
Merci !
3 Réponses :
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)
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.
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."