Connectez Python et pyodbc à Databricks.
Vous pouvez vous connecter depuis votre code Python local via ODBC aux données d'un cluster Databricks ou d'un SQL Warehouse. Pour ce faire, vous pouvez utiliser le module de code Python open source pyodbc.
Suivez ces instructions pour installer, configurer et utiliser pyodbc.
Pour plus d'informations sur pyodbc, consultez le wiki pyodbc.
Databricks propose le Connecteur Databricks SQL pour Python comme alternative à pyodbc. Le connecteur Databricks SQL pour Python est plus facile à configurer et à utiliser, et dispose d'un ensemble de constructions de codage plus robuste que pyodbc. Cependant, pyodbc peut offrir de meilleures performances pour la récupération des résultats de query supérieurs à 10 Mo.
Ces instructions ont été testées avec le driver ODBC Databricks 2.7.5, pyodbc 5.0.1 et unixODBC 2.3.12.
Exigences
-
Une machine de développement locale exécutant l'un des éléments suivants :
- macOS
- Windows
- Une distribution Unix ou Linux qui prend en charge les fichiers
.rpmou.deb
-
pip.
-
Pour Unix, Linux ou macOS, Homebrew.
-
Un cluster Databricks, un warehouse Databricks SQL, ou les deux. Pour plus d'informations, consultez la référence de configuration de Compute et connectez-vous à un SQL Warehouse.
Étape 1 : download, installer et configurer un outil
À cette étape, vous download et installez le driver ODBC Databricks, le package unixodbc et le module pyodbc. (Le module pyodbc requiert le package unixodbc sur Unix, Linux et macOS.) Vous configurez également un nom de source de données (DSN) ODBC pour vous authentifier auprès de votre cluster ou SQL Warehouse et vous y connecter.
- Download et installez le Driver ODBC Databricks et configurez un DSN ODBC pour votre système d'exploitation.
- Pour Unix, Linux et macOS, installez le package
unixodbc: depuis le terminal, utilisez Homebrew pour exécuter la commandebrew install unixodbc. Pour plus d’informations, consultez unixodbc sur le site web de Homebrew. - Installez le module
pyodbc: depuis le terminal ou l'invite de commande, utilisezpippour exécuter la commandepip install pyodbc. Pour plus d'information, consultez pyodbc sur le site web PyPI et Install dans le Wiki pyodbc.
Étape 2 : Tester votre configuration
Dans cette étape, vous écrivez et exécutez du code Python pour utiliser votre cluster Databricks ou votre warehouse Databricks SQL afin de query la table trips dans le schéma nyctrips du catalogue samples et d'afficher les résultats.
-
Créez un fichier nommé
pyodbc-demo.pyavec le contenu suivant. Remplacez<dsn-name>par le nom du DSN ODBC que vous avez créé précédemment, enregistrez le fichier, puis exécutez le fichier avec votre interpréteur Python.Pythonimport pyodbc
# Connect to the Databricks cluster by using the
# Data Source Name (DSN) that you created earlier.
conn = pyodbc.connect("DSN=<dsn-name>", autocommit=True)
# Run a SQL query by using the preceding connection.
cursor = conn.cursor()
cursor.execute(f"SELECT * FROM samples.nyctaxi.trips")
# Print the rows retrieved from the query.
for row in cursor.fetchall():
print(row) -
Pour accélérer l'exécution du code, start le cluster qui correspond au paramètre
HTTPPathdans votre DSN. -
Exécutez le fichier
pyodbc-demo.pyavec votre interpréteur Python. L'information sur les lignes du tableau est affichée.
Étapes suivantes
- Pour exécuter le code de test Python sur un autre cluster ou SQL Warehouse, créez un DSN différent et remplacez
<dsn-name>par le nom du DSN. - Pour exécuter le code de test Python avec une autre query SQL, modifiez la chaîne de commande
execute.
Utilisation d'une connexion sans DSN
En guise d’alternative à l’utilisation d’un nom DSN, vous pouvez spécifier les paramètres de connexion directement. L’exemple suivant montre comment utiliser une chaîne de connexion sans DSN pour l’authentification par jeton d’accès personnel Databricks. Cet exemple suppose que vous disposez des variables d’environnement suivantes :
- Définissez
DATABRICKS_SERVER_HOSTNAMEsur le nom d’instance du workspace, par exempledbc-a1b2345c-d6e7.cloud.databricks.com. - Définissez
DATABRICKS_HTTP_PATHsur la valeur du Chemin HTTP pour le cluster ou le SQL Warehouse cible dans le Workspace. Pour obtenir la valeur HTTP Path , consultez Obtenir les détails de connexion pour une ressource de calcul Databricks. - Définissez
DATABRICKS_TOKENsur le jeton d'accès personnel Databricks pour l'utilisateur cible. Pour créer un jeton d'accès personnel, consultez Créer des jetons d'accès personnels pour les utilisateurs de workspace.
Pour définir les variables d’environnement, consultez la documentation de votre système d’exploitation.
import pyodbc
import os
conn = pyodbc.connect(
"Driver=/Library/simba/spark/lib/libsparkodbc_sb64-universal.dylib;" +
f"Host={os.getenv('DATABRICKS_HOST')};" +
"Port=443;" +
f"HTTPPath={os.getenv('DATABRICKS_HTTP_PATH')};" +
"SSL=1;" +
"ThriftTransport=2;" +
"AuthMech=3;" +
"UID=token;" +
f"PWD={os.getenv('DATABRICKS_TOKEN')}",
autocommit = True
)
# Run a SQL query by using the preceding connection.
cursor = conn.cursor()
cursor.execute("SELECT * FROM samples.nyctaxi.trips")
# Print the rows retrieved from the query.
for row in cursor.fetchall():
print(row)
L'exemple suivant utilise l'authentification OAuth utilisateur-machine (U2M) ou OAuth 2.0 par navigateur au lieu d'un jeton d'accès personnel Databricks. Cet exemple suppose que vous avez déjà défini les variables d'environnement DATABRICKS_SERVER_HOSTNAME et DATABRICKS_HTTP_PATH précédentes.
import pyodbc
import os
conn = pyodbc.connect(
"Driver=/Library/simba/spark/lib/libsparkodbc_sb64-universal.dylib;" +
f"Host={os.getenv('DATABRICKS_HOST')};" +
"Port=443;" +
f"HTTPPath={os.getenv('DATABRICKS_HTTP_PATH')};" +
"SSL=1;" +
"ThriftTransport=2;" +
"AuthMech=11;" +
"Auth_Flow=2;" +
"PWD=1234567",
autocommit = True
)
# Run a SQL query by using the preceding connection.
cursor = conn.cursor()
cursor.execute("SELECT * FROM samples.nyctaxi.trips")
# Print the rows retrieved from the query.
for row in cursor.fetchall():
print(row)
L'exemple suivant utilise l'authentification OAuth machine-à-machine (M2M) ou les identifiants client OAuth 2.0. Cet exemple suppose que vous avez déjà défini les variables d'environnement précédentes DATABRICKS_SERVER_HOSTNAME et DATABRICKS_HTTP_PATH, ainsi que les variables d'environnement suivantes :
- Définissez
DATABRICKS_CLIENT_IDsur la valeur de l'**UUID**/ID d'application du Service Principal. - Définissez sur
DATABRICKS_OAUTH_SECRETla valeur du **Secret** OAuth du service principal.
Pour plus d'information, consultez l'authentification OAuth machine à machine (M2M).
import pyodbc
import os
conn = pyodbc.connect(
"Driver=/Library/simba/spark/lib/libsparkodbc_sb64-universal.dylib;" +
f"Host={os.getenv('DATABRICKS_HOST')};" +
"Port=443;" +
f"HTTPPath={os.getenv('DATABRICKS_HTTP_PATH')};" +
"SSL=1;" +
"ThriftTransport=2;" +
"AuthMech=11;" +
"Auth_Flow=1;" +
f"Auth_Client_ID={os.getenv('DATABRICKS_CLIENT_ID')};" +
f"Auth_Client_Secret={os.getenv('DATABRICKS_OAUTH_SECRET')}",
autocommit = True
)
# Run a SQL query by using the preceding connection.
cursor = conn.cursor()
cursor.execute("SELECT * FROM samples.nyctaxi.trips")
# Print the rows retrieved from the query.
for row in cursor.fetchall():
print(row)
Dépannage
Cette section aborde les problèmes courants lors de l'utilisation de pyodbc avec Databricks.
Erreur de décodage Unicode
Problème : Vous recevez un message d’erreur similaire à ce qui suit :
<class 'pyodbc.Error'> returned a result with an error set
Traceback (most recent call last):
File "/Users/user/.pyenv/versions/3.7.5/lib/python3.7/encodings/utf_16_le.py", line 16, in decode
return codecs.utf_16_le_decode(input, errors, True)
UnicodeDecodeError: 'utf-16-le' codec can't decode bytes in position 2112-2113: illegal UTF-16 surrogate
Cause : Un problème existe dans la version pyodbc 4.0.31 ou antérieure, qui pourrait se manifester par de tels symptômes lors de l'exécution de requêtes qui renvoient des colonnes avec des noms longs ou un message d'erreur long. Le problème a été résolu par une version plus récente de pyodbc.
**Solution** : Mettez à niveau votre installation de pyodbc vers la version 4.0.32 ou supérieure.
Dépannage général
Voir les problèmes dans le repository mkleehammer/pyodbc sur GitHub.