توصيل Python وpyodbc ب Azure Databricks
يمكنك الاتصال من تعليمة Python البرمجية المحلية الخاصة بك من خلال ODBC بالبيانات في مجموعة Azure Databricks أو مستودع SQL. للقيام بذلك، يمكنك استخدام وحدة pyodbc
التعليمات البرمجية مصدر مفتوح Python .
اتبع هذه الإرشادات لتثبيت وتكوين واستخدام pyodbc
.
لمزيد من المعلومات حول pyodbc
، راجع pyodbc Wiki.
إشعار
يوفر Databricks موصل Databricks SQL ل Python كبديل ل pyodbc
. يعد Databricks SQL Connector ل Python أسهل في الإعداد والاستخدام، ويحتوي على مجموعة أكثر قوة من بنيات الترميز، من pyodbc
. ومع ذلك pyodbc
قد يكون أداء أفضل عند إحضار نتائج الاستعلامات أعلى من 10 ميغابايت.
تم اختبار هذه الإرشادات باستخدام برنامج تشغيل Databricks ODBC 2.7.5 وpyodbc 5.0.1 وunixODBC 2.3.12.
المتطلبات
- جهاز تطوير محلي يعمل بأحد الإجراءات التالية:
- macOS
- Windows
- توزيع Unix أو Linux الذي يدعم
.rpm
أو.deb
الملفات
- نقطة.
- بالنسبة إلى Unix أو Linux أو macOS، Homebrew.
- مجموعة Azure Databricks أو مستودع Databricks SQL أو كليهما. لمزيد من المعلومات، راجع مرجع تكوين الحساب والاتصال بمستودع SQL.
الخطوة 1: تنزيل البرامج وتثبيتها وتكوينها
في هذه الخطوة، يمكنك تنزيل وتثبيت برنامج تشغيل Databricks ODBC والحزمة unixodbc
والوحدة النمطية pyodbc
. pyodbc
(تتطلب الوحدة النمطية الحزمة على unixodbc
Unix وLinux وmacOS.) يمكنك أيضا تكوين اسم مصدر بيانات ODBC (DSN) للمصادقة مع نظام المجموعة أو مستودع SQL والاتصال به.
- قم بتنزيل وتثبيت برنامج تشغيل Databricks ODBC وتكوين ODBC DSN لنظام التشغيل الخاص بك.
- بالنسبة إلى Unix وLinux وmacOS، قم بتثبيت الحزمة
unixodbc
: من المحطة الطرفية، استخدم Homebrew لتشغيل الأمرbrew install unixodbc
. لمزيد من المعلومات، راجع unixodbc على موقع Homebrew على الويب. - تثبيت الوحدة النمطية
pyodbc
: من الوحدة الطرفية أو موجه الأوامر، استخدمpip
لتشغيل الأمرpip install pyodbc
. لمزيد من المعلومات، راجع pyodbc على موقع PyPI على الويب وتثبيت في pyodbc Wiki.
الخطوة 2: اختبار التكوين الخاص بك
في هذه الخطوة، يمكنك كتابة وتشغيل تعليمة Python البرمجية لاستخدام مجموعة Azure Databricks أو مستودع Databricks SQL للاستعلام عن trips
الجدول في مخطط الكتالوج samples
nyctrips
وعرض النتائج.
إنشاء ملف باسم
pyodbc-demo.py
بالمحتوى التالي. استبدل<dsn-name>
باسم ODBC DSN الذي قمت بإنشائه سابقا، واحفظ الملف، ثم قم بتشغيل الملف مع مترجم 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)
لتسريع تشغيل التعليمات البرمجية، ابدأ تشغيل نظام المجموعة الذي يتوافق مع
HTTPPath
الإعداد في DSN الخاص بك.pyodbc-demo.py
قم بتشغيل الملف باستخدام مترجم Python. يتم عرض معلومات حول صفوف الجدول.
الخطوات التالية
- لتشغيل التعليمات البرمجية لاختبار Python مقابل مجموعة مختلفة أو مستودع SQL، قم بإنشاء DSN مختلف وقم بالتغيير
<dsn-name>
إلى اسم DSN. - لتشغيل التعليمات البرمجية لاختبار Python باستخدام استعلام SQL مختلف، قم بتغيير
execute
سلسلة الأوامر.
استخدام اتصال بدون DSN
كبديل لاستخدام اسم DSN، يمكنك تحديد إعدادات الاتصال المضمنة. يوضح المثال التالي كيفية استخدام سلسلة الاتصال بدون DSN لمصادقة رمز الوصول الشخصي Azure Databricks. يفترض هذا المثال أن لديك متغيرات البيئة التالية:
- قم بتعيين
DATABRICKS_SERVER_HOSTNAME
إلى اسم مثيل مساحة العمل، على سبيل المثالadb-1234567890123456.7.azuredatabricks.net
. - تعيين
DATABRICKS_HTTP_PATH
إلى قيمة مسار HTTP لنظام المجموعة الهدف أو مستودع SQL في مساحة العمل. للحصول على قيمة مسار HTTP، راجع الحصول على تفاصيل الاتصال لمورد حساب Azure Databricks. - قم بتعيين
DATABRICKS_TOKEN
إلى رمز الوصول الشخصي Azure Databricks للمستخدم الهدف. لإنشاء رمز وصول شخصي، راجع الرموز المميزة للوصول الشخصي إلى Azure 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)
يستخدم المثال التالي مصادقة OAuth من مستخدم إلى جهاز (U2M) أو مصادقة مستندة إلى مستعرض OAuth 2.0 بدلا من رمز وصول شخصي ل Azure Databricks. يفترض هذا المثال أنك قمت بالفعل بتعيين المتغيرات السابقة DATABRICKS_SERVER_HOSTNAME
ومتغيرات DATABRICKS_HTTP_PATH
البيئة.
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)
يستخدم المثال التالي مصادقة بيانات اعتماد عميل OAuth من جهاز إلى جهاز (M2M) أو OAuth 2.0. يفترض هذا المثال أنك قمت بالفعل بتعيين المتغيرات السابقة DATABRICKS_SERVER_HOSTNAME
ومتغيرات DATABRICKS_HTTP_PATH
البيئة بالإضافة إلى متغيرات البيئة التالية:
- تعيين
ARM_CLIENT_ID
إلى قيمة معرف التطبيق (العميل) لكيان الخدمة. - تعيين
DATABRICKS_OAUTH_SECRET
إلى قيمة OAuth Secret الخاصة بكيان الخدمة. (أسرار معرف Microsoft Entra غير مدعومة لمصادقة بيانات اعتماد عميل OAuth M2M أو OAuth 2.0 مع برنامج تشغيل Databricks ODBC.)
لمزيد من المعلومات، راجع مصادقة OAuth من جهاز إلى جهاز (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('ARM_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)
استكشاف الأخطاء وإصلاحها
يعالج هذا القسم المشكلات الشائعة عند استخدام pyodbc
مع Databricks.
خطأ فك ترميز 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 أو أعلى.
استكشاف الأخطاء وإصلاحها بشكل عام
راجع المشكلات في مستودع mkleehammer/pyodbc على GitHub.