Aller au contenu principal

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.

remarque

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

É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.

  1. Download et installez le Driver ODBC Databricks et configurez un DSN ODBC pour votre système d'exploitation.
  2. Pour Unix, Linux et macOS, installez le package unixodbc : depuis le terminal, utilisez Homebrew pour exécuter la commande brew install unixodbc. Pour plus d’informations, consultez unixodbc sur le site web de Homebrew.
  3. Installez le module pyodbc : depuis le terminal ou l'invite de commande, utilisez pip pour exécuter la commande pip 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.

  1. Créez un fichier nommé pyodbc-demo.py avec 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.

    Python
    import 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)
  2. Pour accélérer l'exécution du code, start le cluster qui correspond au paramètre HTTPPath dans votre DSN.

  3. Exécutez le fichier pyodbc-demo.py avec 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 :

Pour définir les variables d’environnement, consultez la documentation de votre système d’exploitation.

Python
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.

Python
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_ID sur la valeur de l'**UUID**/ID d'application du Service Principal.
  • Définissez sur DATABRICKS_OAUTH_SECRET la valeur du **Secret** OAuth du service principal.

Pour plus d'information, consultez l'authentification OAuth machine à machine (M2M).

Python
   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.