Python と pyodbc を Databricks に接続する
ローカル Python API コードから ODBC を介して、 Databricks クラスターまたは SQLウェアハウス内のデータに接続できます。 これを行うには、オープンソース Python コード モジュール pyodbc を使用できます。
次の手順に従って、 pyodbcをインストール、構成、および使用します。
pyodbcの詳細については、 pyodbc Wiki を参照してください。
Databricks は、pyodbcの代わりに Databricks SQL Connector for Python を提供しています。Databricks SQL Connector for Python は、 pyodbcよりもセットアップと使用が簡単で、より堅牢なコーディング コンストラクトのセットを備えています。 ただし pyodbc 10 MB を超えるクエリ結果をフェッチすると、パフォーマンスが向上する可能性があります。
これらの手順は、 Databricks ODBC ドライバー 2.7.5、 pyodbc 5.0.1、 および unixODBC 2.3.12 でテストされています。
必要条件
-
次のいずれかを実行しているローカル開発マシン。
- macOSの
- Windows
.rpmまたは.debファイルをサポートする Unix または Linux ディストリビューション
-
Databricks クラスター、Databricks SQL ウェアハウス、またはその両方。詳細については、「コンピュート構成リファレンス」および「SQLウェアハウスへの接続」を参照してください。
ステップ 1: ソフトウェアのダウンロード、インストール、および構成
この手順では、Databricks ODBC ドライバー、 unixodbc パッケージ、および pyodbc モジュールをダウンロードしてインストールします。 ( pyodbc モジュールには、Unix、Linux、macOS の unixodbc パッケージが必要です。 また、 ODBC データソース名 (DSN) を設定して、クラスターまたはウェアハウスで認証および接続 SQL。
- Databricks ODBC ドライバーをダウンロードしてインストール し、オペレーティング システム用の ODBC DSN を構成します 。
- Unix、Linux、およびmacOSの場合は、
unixodbcパッケージをインストールします:ターミナルから、Homebrewを使用してコマンドを実行しますbrew install unixodbc。 詳細については、Homebrew Web サイトの unixodbc を参照してください。 pyodbcモジュールをインストールします:ターミナルまたはコマンドプロンプトから、pipを使用してコマンドを実行しますpip install pyodbc。pyodbc詳細については、PyPI Web サイトの およびpyodbcWiki のインストールを参照してください 。
ステップ2: 設定をテストしてください
この手順では、PythonDatabricks クラスターまたは Databricks SQL ウェアハウスを使用して samples カタログの nyctrips スキーマの trips テーブルをクエリし、結果を表示するコードを記述して実行します。
-
次の内容で
pyodbc-demo.pyという名前のファイルを作成します。<dsn-name>を前に作成した ODBC DSN の名前に置き換え、ファイルを保存してから、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) -
コードの実行を高速化するには、DSN の
HTTPPath設定に対応するクラスターを開始します。 -
Pythonインタプリタで
pyodbc-demo.pyファイルを実行します。テーブルのローに関する情報が表示されます。
次のステップ
- Python テスト コードを別のクラスター ウェアハウスまたはSQLウェアハウスに対して実行するには、別の DSN を作成し、
<dsn-name>を DSN の名前に変更します。 - Python テスト・コードを別の SQL クエリーで実行するには、
executeコマンド文字列を変更します。
DSN レス接続の使用
DSN 名を使用する代わりに、接続設定をインラインで指定することもできます。 次の例は、Databricks の個人用アクセス トークン認証に DSN なしの接続文字列を使用する方法を示しています。 この例では、次の環境変数があることを前提としています。
DATABRICKS_SERVER_HOSTNAMEをワークスペース インスタンス名に設定します (例:1234567890123456.7.gcp.databricks.com)。DATABRICKS_HTTP_PATHを、ワークスペース内のターゲット クラスターまたはウェアハウスの HTTP パス 値 SQL設定します。 HTTP パス の値を取得するには、「Databricks コンピュート リソースの接続の詳細を取得する」を参照してください。DATABRICKS_TOKEN対象ユーザーのDatabricks個人アクセストークンに設定します。 個人的なアクセス枠を作成するには、 「ワークスペース ユーザー向けの個人的なアクセス枠を作成する」を参照してください。
環境変数を設定するには、オペレーティングシステムのドキュメントを参照してください。
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)
トラブルシューティング
このセクションでは、Databricks で pyodbc を使用する場合の一般的な問題について説明します。
Unicode デコード エラー
問題 :次のようなエラーメッセージが表示されます。
<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
原因 : pyodbc バージョン 4.0.31 以下に問題があり、長い名前の列または長いエラー メッセージを返すクエリを実行すると、このような症状が発生する可能性があります。 この問題は、新しいバージョンの pyodbcで修正されています。
ソリューション : pyodbc のインストールをバージョン 4.0.32 以降にアップグレードします。