Databricks SQL Driver for Node.js
برنامج تشغيل Databricks SQL ل Node.js هو مكتبة Node.js تسمح لك باستخدام تعليمات JavaScript البرمجية لتشغيل أوامر SQL على موارد حساب Azure Databricks.
المتطلبات
جهاز تطوير يعمل Node.js، الإصدار 14 أو أعلى. لطباعة الإصدار المثبت من Node.js، قم بتشغيل الأمر
node -v
. لتثبيت واستخدام إصدارات مختلفة من Node.js، يمكنك استخدام أدوات مثل Node Version Manager (nvm).مدير الحِزَم العقدة (
npm
). تتضمنnpm
الإصدارات اللاحقة من Node.js بالفعل . للتحقق مما إذا كانnpm
مثبتا، قم بتشغيل الأمرnpm -v
. لتثبيتnpm
إذا لزم الأمر، يمكنك اتباع إرشادات مثل تلك الموجودة في تنزيل npm وتثبيته.حزمة @databricks/sql من npm. لتثبيت الحزمة
@databricks/sql
في مشروع Node.js الخاص بك كتبعية، استخدمnpm
لتشغيل الأمر التالي من داخل نفس الدليل مثل مشروعك:npm i @databricks/sql
إذا كنت تريد تثبيت TypeScript واستخدامه في مشروع Node.js الخاص بك ك
devDependencies
، فاستخدمnpm
لتشغيل الأوامر التالية من داخل نفس الدليل مثل مشروعك:npm i -D typescript npm i -D @types/node
قيمة Server Hostname وHTTP Path للمجموعة الموجودة أو مستودع SQL.
المصادقة
يدعم برنامج تشغيل Databricks SQL ل Node.js أنواع مصادقة Azure Databricks التالية:
- مصادقة رمز الوصول الشخصي ل Databricks
- مصادقة الرمز المميز لمعرف Microsoft Entra
- مصادقة OAuth من جهاز إلى جهاز (M2M)
- مصادقة OAuth من مستخدم إلى جهاز (U2M)
لا يدعم برنامج تشغيل Databricks SQL ل Node.js بعد أنواع مصادقة Azure Databricks التالية:
إشعار
كأفضل ممارسة أمان، يجب عدم تضمين قيم متغير اتصال التعليمات البرمجية الثابتة في التعليمات البرمجية الخاصة بك. بدلا من ذلك، يجب استرداد قيم متغير الاتصال هذه من موقع آمن. على سبيل المثال، تستخدم القصاصات البرمجية والأمثلة في هذه المقالة متغيرات البيئة.
مصادقة رمز الوصول الشخصي ل Databricks
لاستخدام برنامج تشغيل Databricks SQL ل Node.js مع المصادقة، يجب أولا إنشاء رمز مميز للوصول الشخصي ل Azure Databricks. للحصول على تفاصيل حول هذه الخطوة، راجع الرموز المميزة للوصول الشخصي إلى Azure Databricks لمستخدمي مساحة العمل.
لمصادقة برنامج تشغيل Databricks SQL ل Node.js، استخدم القصاصة البرمجية التالية. تفترض هذه القصاصة البرمجية أنك قمت بتعيين متغيرات البيئة التالية:
DATABRICKS_SERVER_HOSTNAME
تعيين إلى قيمة Server Hostname لنظام المجموعة أو مستودع SQL.DATABRICKS_HTTP_PATH
، قم بتعيين إلى قيمة مسار HTTP لنظام المجموعة أو مستودع SQL.DATABRICKS_TOKEN
، قم بتعيين إلى رمز الوصول الشخصي Azure Databricks.
لتعيين متغيرات البيئة، راجع وثائق نظام التشغيل الخاص بك.
JavaScript
const { DBSQLClient } = require('@databricks/sql');
const serverHostname = process.env.DATABRICKS_SERVER_HOSTNAME;
const httpPath = process.env.DATABRICKS_HTTP_PATH;
const token = process.env.DATABRICKS_TOKEN;
if (!token || !serverHostname || !httpPath) {
throw new Error("Cannot find Server Hostname, HTTP Path, or " +
"personal access token. " +
"Check the environment variables DATABRICKS_SERVER_HOSTNAME, " +
"DATABRICKS_HTTP_PATH, and DATABRICKS_TOKEN.");
}
const client = new DBSQLClient();
const connectOptions = {
token: token,
host: serverHostname,
path: httpPath
};
client.connect(connectOptions)
// ...
TypeScript
import { DBSQLClient } from "@databricks/sql";
const serverHostname: string = process.env.DATABRICKS_SERVER_HOSTNAME || '';
const httpPath: string = process.env.DATABRICKS_HTTP_PATH || '';
const token: string = process.env.DATABRICKS_TOKEN || '';
if (token == '' || serverHostname == '' || httpPath == '') {
throw new Error("Cannot find Server Hostname, HTTP Path, or personal access token. " +
"Check the environment variables DATABRICKS_SERVER_HOSTNAME, " +
"DATABRICKS_HTTP_PATH, and DATABRICKS_TOKEN.");
}
const client: DBSQLClient = new DBSQLClient();
const connectOptions = {
token: token,
host: serverHostname,
path: httpPath
};
client.connect(connectOptions)
// ...
مصادقة OAuth من مستخدم إلى جهاز (U2M)
يدعم Databricks SQL Driver للإصدارات Node.js 1.8.0 والإصدارات الأحدث مصادقة OAuth من مستخدم إلى جهاز (U2M).
لمصادقة برنامج تشغيل Databricks SQL ل Node.js باستخدام مصادقة OAuth U2M، استخدم مقتطف التعليمات البرمجية التالي. تفترض هذه القصاصة البرمجية أنك قمت بتعيين متغيرات البيئة التالية:
DATABRICKS_SERVER_HOSTNAME
تعيين إلى قيمة Server Hostname لنظام المجموعة أو مستودع SQL.DATABRICKS_HTTP_PATH
، قم بتعيين إلى قيمة مسار HTTP لنظام المجموعة أو مستودع SQL.
لتعيين متغيرات البيئة، راجع وثائق نظام التشغيل الخاص بك.
JavaScript
const { DBSQLClient } = require('@databricks/sql');
const serverHostname = process.env.DATABRICKS_SERVER_HOSTNAME;
const httpPath = process.env.DATABRICKS_HTTP_PATH;
if (!serverHostname || !httpPath) {
throw new Error("Cannot find Server Hostname or HTTP Path. " +
"Check the environment variables DATABRICKS_SERVER_HOSTNAME " +
"and DATABRICKS_HTTP_PATH.");
}
const client = new DBSQLClient();
const connectOptions = {
authType: "databricks-oauth",
useDatabricksOAuthInAzure: true,
host: serverHostname,
path: httpPath
};
client.connect(connectOptions)
// ...
TypeScript
import { DBSQLClient } from "@databricks/sql";
const serverHostname: string = process.env.DATABRICKS_SERVER_HOSTNAME || '';
const httpPath: string = process.env.DATABRICKS_HTTP_PATH || '';
if (serverHostname == '' || httpPath == '') {
throw new Error("Cannot find Server Hostname or HTTP Path. " +
"Check the environment variables DATABRICKS_SERVER_HOSTNAME " +
"and DATABRICKS_HTTP_PATH.");
}
const client: DBSQLClient = new DBSQLClient();
const connectOptions = {
authType: "databricks-oauth",
useDatabricksOAuthInAzure: true,
host: serverHostname,
path: httpPath
};
client.connect(connectOptions)
// ...
مصادقة OAuth من جهاز إلى جهاز (M2M)
يدعم Databricks SQL Driver للإصدارات Node.js 1.8.0 والإصدارات الأحدث مصادقة OAuth من جهاز إلى جهاز (U2M).
لاستخدام برنامج تشغيل Databricks SQL ل Node.js مع مصادقة OAuth M2M، يجب عليك القيام بما يلي:
إنشاء كيان خدمة Azure Databricks في مساحة عمل Azure Databricks، وإنشاء سر OAuth لكيان الخدمة هذا.
لإنشاء كيان الخدمة وسر OAuth الخاص به، راجع مصادقة الوصول إلى Azure Databricks باستخدام كيان خدمة باستخدام OAuth (OAuth M2M). دون ملاحظة عن قيمة UUID أو Application ID الخاصة بكيان الخدمة، والقيمة السرية لسر OAuth الخاص بكيان الخدمة.
امنح كيان الخدمة حق الوصول إلى نظام المجموعة أو المستودع. راجع حساب الأذونات أو إدارة مستودع SQL.
لمصادقة برنامج تشغيل Databricks SQL ل Node.js، استخدم القصاصة البرمجية التالية. تفترض هذه القصاصة البرمجية أنك قمت بتعيين متغيرات البيئة التالية:
DATABRICKS_SERVER_HOSTNAME
تعيين إلى قيمة Server Hostname لنظام المجموعة أو مستودع SQL.DATABRICKS_HTTP_PATH
، قم بتعيين إلى قيمة مسار HTTP لنظام المجموعة أو مستودع SQL.DATABRICKS_CLIENT_ID
، قم بتعيين إلى قيمة UUID أو معرف التطبيق الخاصة بكيان الخدمة.DATABRICKS_CLIENT_SECRET
، قم بتعيين إلى القيمة السرية لسر OAuth الخاص بكيان الخدمة.
لتعيين متغيرات البيئة، راجع وثائق نظام التشغيل الخاص بك.
JavaScript
const { DBSQLClient } = require('@databricks/sql');
const serverHostname = process.env.DATABRICKS_SERVER_HOSTNAME;
const httpPath = process.env.DATABRICKS_HTTP_PATH;
const clientId = process.env.DATABRICKS_CLIENT_ID;
const clientSecret = process.env.DATABRICKS_CLIENT_SECRET;
if (!serverHostname || !httpPath || !clientId || !clientSecret) {
throw new Error("Cannot find Server Hostname, HTTP Path, or " +
"service principal ID or secret. " +
"Check the environment variables DATABRICKS_SERVER_HOSTNAME, " +
"DATABRICKS_HTTP_PATH, DATABRICKS_CLIENT_ID, and " +
"DATABRICKS_CLIENT_SECRET.");
}
const client = new DBSQLClient();
const connectOptions = {
authType: "databricks-oauth",
useDatabricksOAuthInAzure: true,
host: serverHostname,
path: httpPath,
oauthClientId: clientId,
oauthClientSecret: clientSecret
};
client.connect(connectOptions)
// ...
TypeScript
import { DBSQLClient } from "@databricks/sql";
const serverHostname: string = process.env.DATABRICKS_SERVER_HOSTNAME || '';
const httpPath: string = process.env.DATABRICKS_HTTP_PATH || '';
const clientId: string = process.env.DATABRICKS_CLIENT_ID || '';
const clientSecret: string = process.env.DATABRICKS_CLIENT_SECRET || '';
if (serverHostname == '' || httpPath == '' || clientId == '' || clientSecret == '') {
throw new Error("Cannot find Server Hostname, HTTP Path, or " +
"service principal ID or secret. " +
"Check the environment variables DATABRICKS_SERVER_HOSTNAME, " +
"DATABRICKS_HTTP_PATH, DATABRICKS_CLIENT_ID, and " +
"DATABRICKS_CLIENT_SECRET.");
}
const client: DBSQLClient = new DBSQLClient();
const connectOptions = {
authType: "databricks-oauth",
useDatabricksOAuthInAzure: true,
host: serverHostname,
path: httpPath,
oauthClientId: clientId,
oauthClientSecret: clientSecret
};
client.connect(connectOptions)
// ...
مصادقة الرمز المميز لمعرف Microsoft Entra
لاستخدام برنامج تشغيل Databricks SQL ل Node.js مع مصادقة الرمز المميز لمعرف Microsoft Entra، يجب توفير برنامج تشغيل Databricks SQL ل Node.js مع الرمز المميز لمعرف Microsoft Entra. لإنشاء رمز مميز للوصول إلى معرف Microsoft Entra، قم بما يلي:
- بالنسبة لمستخدم Azure Databricks، يمكنك استخدام Azure CLI. راجع الحصول على الرموز المميزة لمعرف Microsoft Entra للمستخدمين باستخدام Azure CLI.
- للحصول على أساس خدمة معرف Microsoft Entra، راجع الحصول على رمز مميز للوصول إلى معرف Microsoft Entra باستخدام Azure CLI. لإنشاء كيان خدمة مدار من Microsoft Entra ID، راجع إدارة كيانات الخدمة.
الرموز المميزة لمعرف Microsoft Entra لها عمر افتراضي يبلغ حوالي ساعة واحدة. لإنشاء رمز مميز جديد لمعرف Microsoft Entra، كرر هذه العملية.
لمصادقة برنامج تشغيل Databricks SQL ل Node.js، استخدم القصاصة البرمجية التالية. تفترض هذه القصاصة البرمجية أنك قمت بتعيين متغيرات البيئة التالية:
DATABRICKS_SERVER_HOSTNAME
تعيين إلى قيمة Server Hostname لنظام المجموعة أو مستودع SQL.DATABRICKS_HTTP_PATH
، قم بتعيين إلى قيمة مسار HTTP لنظام المجموعة أو مستودع SQL.DATABRICKS_TOKEN
، قم بتعيين إلى الرمز المميز لمعرف Microsoft Entra.
لتعيين متغيرات البيئة، راجع وثائق نظام التشغيل الخاص بك.
JavaScript
const { DBSQLClient } = require('@databricks/sql');
const serverHostname = process.env.DATABRICKS_SERVER_HOSTNAME;
const httpPath = process.env.DATABRICKS_HTTP_PATH;
const token = process.env.DATABRICKS_TOKEN;
if (!token || !serverHostname || !httpPath) {
throw new Error("Cannot find Server Hostname, HTTP Path, or " +
"<ms-entra-id> token. " +
"Check the environment variables DATABRICKS_SERVER_HOSTNAME, " +
"DATABRICKS_HTTP_PATH, and DATABRICKS_TOKEN.");
}
const client = new DBSQLClient();
const connectOptions = {
token: token,
host: serverHostname,
path: httpPath
};
client.connect(connectOptions)
// ...
TypeScript
import { DBSQLClient } from "@databricks/sql";
const serverHostname: string = process.env.DATABRICKS_SERVER_HOSTNAME || '';
const httpPath: string = process.env.DATABRICKS_HTTP_PATH || '';
const token: string = process.env.DATABRICKS_TOKEN || '';
if (token == '' || serverHostname == '' || httpPath == '') {
throw new Error("Cannot find Server Hostname, HTTP Path, or " +
"<ms-entra-id> token. " +
"Check the environment variables DATABRICKS_SERVER_HOSTNAME, " +
"DATABRICKS_HTTP_PATH, and DATABRICKS_TOKEN.");
}
const client: DBSQLClient = new DBSQLClient();
const connectOptions = {
token: token,
host: serverHostname,
path: httpPath
};
client.connect(connectOptions)
// ...
بيانات الاستعلام
يوضح مثال التعليمات البرمجية التالي كيفية استدعاء برنامج تشغيل Databricks SQL ل Node.js لتشغيل استعلام SQL أساسي على مورد حساب Azure Databricks. يقوم هذا الأمر بإرجاع أول صفين من trips
الجدول في مخطط الكتالوج nyctaxi
samples
.
إشعار
يوضح مثال التعليمات البرمجية التالي كيفية استخدام رمز وصول شخصي Azure Databricks للمصادقة. لاستخدام أنواع مصادقة Azure Databricks الأخرى المتوفرة بدلا من ذلك، راجع المصادقة.
يسترد مثال التعليمات البرمجية token
server_hostname
هذا قيم متغيرات الاتصال و http_path
من مجموعة من متغيرات بيئة Azure Databricks. تحتوي متغيرات البيئة هذه على أسماء متغيرات البيئة التالية:
DATABRICKS_TOKEN
، الذي يمثل رمز الوصول الشخصي الخاص بك في Azure Databricks من المتطلبات.DATABRICKS_SERVER_HOSTNAME
، الذي يمثل قيمة Server Hostname من المتطلبات.DATABRICKS_HTTP_PATH
، الذي يمثل قيمة مسار HTTP من المتطلبات.
يمكنك استخدام أساليب أخرى لاسترداد قيم متغيرات الاتصال هذه. استخدام متغيرات البيئة هو نهج واحد فقط بين العديد من.
يوضح مثال التعليمات البرمجية التالي كيفية استدعاء Databricks SQL Connector Node.js لتشغيل أمر SQL أساسي على نظام مجموعة أو مستودع SQL. يقوم هذا الأمر بإرجاع أول صفين من trips
الجدول.
JavaScript
const { DBSQLClient } = require('@databricks/sql');
const token = process.env.DATABRICKS_TOKEN;
const serverHostname = process.env.DATABRICKS_SERVER_HOSTNAME;
const httpPath = process.env.DATABRICKS_HTTP_PATH;
if (!token || !serverHostname || !httpPath) {
throw new Error("Cannot find Server Hostname, HTTP Path, or personal access token. " +
"Check the environment variables DATABRICKS_TOKEN, " +
"DATABRICKS_SERVER_HOSTNAME, and DATABRICKS_HTTP_PATH.");
}
const client = new DBSQLClient();
const connectOptions = {
token: token,
host: serverHostname,
path: httpPath
};
client.connect(connectOptions)
.then(async client => {
const session = await client.openSession();
const queryOperation = await session.executeStatement(
'SELECT * FROM samples.nyctaxi.trips LIMIT 2',
{
runAsync: true,
maxRows: 10000 // This option enables the direct results feature.
}
);
const result = await queryOperation.fetchAll();
await queryOperation.close();
console.table(result);
await session.close();
await client.close();
})
.catch((error) => {
console.error(error);
});
TypeScript
import { DBSQLClient } from '@databricks/sql';
import IDBSQLSession from '@databricks/sql/dist/contracts/IDBSQLSession';
import IOperation from '@databricks/sql/dist/contracts/IOperation';
const serverHostname: string = process.env.DATABRICKS_SERVER_HOSTNAME || '';
const httpPath: string = process.env.DATABRICKS_HTTP_PATH || '';
const token: string = process.env.DATABRICKS_TOKEN || '';
if (serverHostname == '' || httpPath == '' || token == '') {
throw new Error("Cannot find Server Hostname, HTTP Path, or personal access token. " +
"Check the environment variables DATABRICKS_SERVER_HOSTNAME, " +
"DATABRICKS_HTTP_PATH, and DATABRICKS_TOKEN.");
}
const client: DBSQLClient = new DBSQLClient();
const connectOptions = {
host: serverHostname,
path: httpPath,
token: token
};
client.connect(connectOptions)
.then(async client => {
const session: IDBSQLSession = await client.openSession();
const queryOperation: IOperation = await session.executeStatement(
'SELECT * FROM samples.nyctaxi.trips LIMIT 2',
{
runAsync: true,
maxRows: 10000 // This option enables the direct results feature.
}
);
const result = await queryOperation.fetchAll();
await queryOperation.close();
console.table(result);
await session.close();
client.close();
})
.catch((error) => {
console.error(error);
});
إخراج:
┌─────────┬─────┬────────┬───────────┬───────┬─────────┬────────┬───────┬───────┬────────┬────────┬────────┐
│ (index) │ _c0 │ carat │ cut │ color │ clarity │ depth │ table │ price │ x │ y │ z │
├─────────┼─────┼────────┼───────────┼───────┼─────────┼────────┼───────┼───────┼────────┼────────┼────────┤
│ 0 │ '1' │ '0.23' │ 'Ideal' │ 'E' │ 'SI2' │ '61.5' │ '55' │ '326' │ '3.95' │ '3.98' │ '2.43' │
│ 1 │ '2' │ '0.21' │ 'Premium' │ 'E' │ 'SI1' │ '59.8' │ '61' │ '326' │ '3.89' │ '3.84' │ '2.31' │
└─────────┴─────┴────────┴───────────┴───────┴─────────┴────────┴───────┴───────┴────────┴────────┴────────┘
جلسات العمل
تحتوي جميع IDBSQLSession
الأساليب التي ترجع IOperation
الكائنات في مرجع واجهة برمجة التطبيقات على المعلمات الشائعة التالية التي تؤثر على سلوكها:
- يؤدي الإعداد
runAsync
إلىtrue
بدء الوضع غير المتزامن.IDBSQLSession
تضع الأساليب العمليات في قائمة الانتظار وترجع في أسرع وقت ممكن. قد تختلف الحالة الحالية للكائن الذي تم إرجاعهIOperation
، والعميل مسؤول عن التحقق من حالته قبل استخدام الذي تم إرجاعهIOperation
. راجع العمليات. يعني الإعدادrunAsync
إلىfalse
أنIDBSQLSession
الأساليب تنتظر اكتمال العمليات. توصي Databricks دائما بتعيينrunAsync
إلىtrue
. - يؤدي الإعداد
maxRows
إلى قيمة غير خالية إلى تمكين النتائج المباشرة. مع النتائج المباشرة، يحاول الخادم انتظار اكتمال العمليات ثم إحضار جزء من البيانات. اعتمادا على مقدار العمل الذي تمكن الخادم من إكماله خلال الوقت المحدد،IOperation
ترجع الكائنات في حالة وسيطة بدلا من بعض الحالات المعلقة. غالبا ما يتم إرجاع جميع بيانات التعريف ونتائج الاستعلام ضمن طلب واحد إلى الخادم. يستخدمmaxRows
الخادم لتحديد عدد السجلات التي يمكنه إرجاعها على الفور. ومع ذلك، قد تكون المجموعة الفعلية بحجم مختلف؛ راجعIDBSQLSession.fetchChunk
. يتم تمكين النتائج المباشرة بشكل افتراضي. توصي Databricks بعدم تعطيل النتائج المباشرة.
العمليات
كما هو موضح في جلسات العمل، IOperation
لا يتم ملء الكائنات التي يتم إرجاعها بواسطة IDBSQLSession
أساليب جلسة العمل في مرجع واجهة برمجة التطبيقات بالكامل. قد تظل عملية الخادم ذات الصلة قيد التقدم، مثل انتظار بدء مستودع Databricks SQL أو تشغيل الاستعلام أو إحضار البيانات. IOperation
تخفي الفئة هذه التفاصيل عن المستخدمين. على سبيل المثال، أساليب مثل fetchAll
، fetchChunk
، وانتظر getSchema
داخليا حتى تكتمل العمليات ثم ترجع النتائج. يمكنك استخدام IOperation.finished()
الأسلوب لانتظار اكتمال العمليات بشكل صريح. تأخذ هذه الأساليب رد اتصال يتم استدعاؤه بشكل دوري أثناء انتظار اكتمال العمليات. progress
تعيين الخيار لمحاولات true
طلب بيانات تقدم إضافية من الخادم وتمريرها إلى رد الاتصال هذا.
يمكن استدعاء الأسلوبين close
و cancel
في أي وقت. عند استدعائها، فإنها تبطل IOperation
الكائن على الفور؛ ويتم إلغاء جميع الاستدعاءات المعلقة مثل fetchAll
fetchChunk
و و getSchema
على الفور ويتم إرجاع خطأ. في بعض الحالات، قد تكون عملية الخادم قد اكتملت بالفعل ويؤثر cancel
الأسلوب على العميل فقط.
fetchAll
يستدعي fetchChunk
الأسلوب داخليا ويجمع جميع البيانات في صفيف. على الرغم من أن هذا ملائم، فقد يتسبب في حدوث أخطاء نفاد الذاكرة عند استخدامها في مجموعات البيانات الكبيرة. fetchAll
عادة ما يتم تمرير الخيارات إلى fetchChunk
.
إحضار مجموعات من البيانات
يستخدم إحضار مجموعات البيانات نمط التعليمات البرمجية التالي:
do {
const chunk = await operation.fetchChunk();
// Process the data chunk.
} while (await operation.hasMoreRows());
يعالج fetchChunk
الأسلوب في مرجع واجهة برمجة التطبيقات البيانات في أجزاء صغيرة لتقليل استهلاك الذاكرة. fetchChunk
ينتظر أولا اكتمال العمليات إذا لم تكن قد اكتملت بالفعل، ثم يستدعي رد الاتصال أثناء دورة الانتظار، ثم يجلب مجموعة البيانات التالية.
يمكنك استخدام maxRows
الخيار لتحديد حجم المجموعة المطلوبة. ومع ذلك، قد يكون للمساحة التي تم إرجاعها حجم مختلف، أصغر أو حتى أكبر في بعض الأحيان. fetchChunk
لا يحاول الإحضار المسبق للبيانات داخليا، من أجل تقسيمها إلى الأجزاء المطلوبة. maxRows
يرسل الخيار إلى الخادم ثم يرجع كل ما يرجعه الخادم. لا تخلط بين هذا maxRows
الخيار والخيار الموجود في IDBSQLSession
. maxRows
تم تمريرها لتحديد fetchChunk
حجم كل مجموعة ولا تفعل أي شيء آخر.
إدارة الملفات في وحدات تخزين كتالوج Unity
يمكنك برنامج تشغيل Databricks SQL من كتابة الملفات المحلية إلى وحدات تخزين كتالوج Unity، وتنزيل الملفات من وحدات التخزين، وحذف الملفات من وحدات التخزين، كما هو موضح في المثال التالي:
JavaScript
const { DBSQLClient } = require('@databricks/sql');
const serverHostname = process.env.DATABRICKS_SERVER_HOSTNAME;
const httpPath = process.env.DATABRICKS_HTTP_PATH;
const token = process.env.DATABRICKS_TOKEN;
if (!token || !serverHostname || !httpPath) {
throw new Error("Cannot find Server Hostname, HTTP Path, or " +
"personal access token. " +
"Check the environment variables DATABRICKS_SERVER_HOSTNAME, " +
"DATABRICKS_HTTP_PATH, and DATABRICKS_TOKEN.");
}
const client = new DBSQLClient();
const connectOptions = {
token: token,
host: serverHostname,
path: httpPath
};
client.connect(connectOptions)
.then(async client => {
const session = await client.openSession();
// Write a local file to a volume in the specified path.
// For writing local files to volumes, you must first specify the path to the
// local folder that contains the file to be written.
// Specify OVERWRITE to overwrite any existing file in that path.
await session.executeStatement(
"PUT 'my-data.csv' INTO '/Volumes/main/default/my-volume/my-data.csv' OVERWRITE", {
stagingAllowedLocalPath: ["/tmp/"]
}
);
// Download a file from a volume in the specified path.
// For downloading files in volumes, you must first specify the path to the
// local folder that will contain the downloaded file.
await session.executeStatement(
"GET '/Volumes/main/default/my-volume/my-data.csv' TO 'my-downloaded-data.csv'", {
stagingAllowedLocalPath: ["/Users/paul.cornell/samples/nodejs-sql-driver/"]
}
)
// Delete a file in a volume from the specified path.
// For deleting files from volumes, you must add stagingAllowedLocalPath,
// but its value will be ignored. As such, in this example, an empty string is
// specified.
await session.executeStatement(
"REMOVE '/Volumes/main/default/my-volume/my-data.csv'", {
stagingAllowedLocalPath: [""]
}
)
await session.close();
await client.close();
})
.catch((error) => {
console.error(error);
});
TypeScript
import { DBSQLClient } from '@databricks/sql';
const serverHostname: string | undefined = process.env.DATABRICKS_SERVER_HOSTNAME;
const httpPath: string | undefined = process.env.DATABRICKS_HTTP_PATH;
const token: string | undefined = process.env.DATABRICKS_TOKEN;
if (!token || !serverHostname || !httpPath) {
throw new Error("Cannot find Server Hostname, HTTP Path, or " +
"personal access token. " +
"Check the environment variables DATABRICKS_SERVER_HOSTNAME, " +
"DATABRICKS_HTTP_PATH, and DATABRICKS_TOKEN.");
}
const client: DBSQLClient = new DBSQLClient();
const connectOptions = {
token: token,
host: serverHostname,
path: httpPath
};
client.connect(connectOptions)
.then(async client => {
const session = await client.openSession();
// Write a local file to a volume in the specified path.
// For writing local files to volumes, you must first specify the path to the
// local folder that contains the file to be written.
// Specify OVERWRITE to overwrite any existing file in that path.
await session.executeStatement(
"PUT 'my-data.csv' INTO '/Volumes/main/default/my-volume/my-data.csv' OVERWRITE", {
stagingAllowedLocalPath: ["/tmp/"]
}
);
// Download a file from a volume in the specified path.
// For downloading files in volumes, you must first specify the path to the
// local folder that will contain the downloaded file.
await session.executeStatement(
"GET '/Volumes/main/default/my-volume/my-data.csv' TO 'my-downloaded-data.csv'", {
stagingAllowedLocalPath: ["/Users/paul.cornell/samples/nodejs-sql-driver/"]
}
)
// Delete a file in a volume from the specified path.
// For deleting files from volumes, you must add stagingAllowedLocalPath,
// but its value will be ignored. As such, in this example, an empty string is
// specified.
await session.executeStatement(
"REMOVE '/Volumes/main/default/my-volume/my-data.csv'", {
stagingAllowedLocalPath: [""]
}
)
await session.close();
await client.close();
})
.catch((error: any) => {
console.error(error);
});
تكوين التسجيل
يوفر المسجل معلومات عن مشاكل تصحيح الأخطاء في الموصل. يتم إنشاء مثيل لكافة DBSQLClient
الكائنات باستخدام مسجل يطبع إلى وحدة التحكم، ولكن عن طريق تمرير مسجل مخصص، يمكنك إرسال هذه المعلومات إلى ملف. يوضح المثال التالي كيفية تكوين مسجل وتغيير مستواه.
JavaScript
const { DBSQLLogger, LogLevel } = require('@databricks/sql');
const logger = new DBSQLLogger({
filepath: 'log.txt',
level: LogLevel.info
});
// Set logger to different level.
logger.setLevel(LogLevel.debug);
TypeScript
import { DBSQLLogger, LogLevel } from '@databricks/sql';
const logger = new DBSQLLogger({
filepath: 'log.txt',
level: LogLevel.info,
});
// Set logger to different level.
logger.setLevel(LogLevel.debug);
للحصول على أمثلة إضافية، راجع مجلد الأمثلة في مستودع databricks/databricks-sql-nodejs على GitHub.
الاختبار
لاختبار التعليمات البرمجية الخاصة بك، يمكنك استخدام أطر عمل اختبار JavaScript مثل Jest. لاختبار التعليمات البرمجية الخاصة بك في ظل ظروف محاكاة دون استدعاء نقاط نهاية Azure Databricks REST API أو تغيير حالة حسابات Azure Databricks أو مساحات العمل الخاصة بك، يمكنك استخدام أطر عمل وهمية مضمنة في Jest.
على سبيل المثال، بالنظر إلى الملف التالي المسمى helpers.js
الذي يحتوي على getDBSQLClientWithPAT
دالة تستخدم رمز وصول شخصي Azure Databricks لإرجاع اتصال بمساحة عمل Azure Databricks، getAllColumnsFromTable
ودالة تستخدم الاتصال للحصول على العدد المحدد لصفوف البيانات من الجدول المحدد (على سبيل المثال، trips
الجدول في samples
مخطط الكتالوج nyctaxi
printResults
)، ودالة لطباعة محتوى صفوف البيانات:
// helpers.js
const { DBSQLClient } = require('@databricks/sql');
async function getDBSQLClientWithPAT(token, serverHostname, httpPath) {
const client = new DBSQLClient();
const connectOptions = {
token: token,
host: serverHostname,
path: httpPath
};
try {
return await client.connect(connectOptions);
} catch (error) {
console.error(error);
throw error;
}
}
async function getAllColumnsFromTable(client, tableSpec, rowCount) {
let session;
let queryOperation;
try {
session = await client.openSession();
queryOperation = await session.executeStatement(
`SELECT * FROM ${tableSpec} LIMIT ${rowCount}`,
{
runAsync: true,
maxRows: 10000 // This option enables the direct results feature.
}
);
} catch (error) {
console.error(error);
throw error;
}
let result;
try {
result = await queryOperation.fetchAll();
} catch (error) {
console.error(error);
throw error;
} finally {
if (queryOperation) {
await queryOperation.close();
}
if (session) {
await session.close();
}
}
return result;
}
function printResult(result) {
console.table(result);
}
module.exports = {
getDBSQLClientWithPAT,
getAllColumnsFromTable,
printResult
};
وبالنظر إلى الملف التالي المسمى main.js
getDBSQLClientWithPAT
الذي يستدعي الدالات و getAllColumnsFromTable
و printResults
:
// main.js
const { getDBSQLClientWithPAT, getAllColumnsFromTable, printResult } = require('./helpers');
const token = process.env.DATABRICKS_TOKEN;
const serverHostname = process.env.DATABRICKS_SERVER_HOSTNAME;
const httpPath = process.env.DATABRICKS_HTTP_PATH;
const tableSpec = process.env.DATABRICKS_TABLE_SPEC;
if (!token || !serverHostname || !httpPath) {
throw new Error("Cannot find Server Hostname, HTTP Path, or personal access token. " +
"Check the environment variables DATABRICKS_TOKEN, " +
"DATABRICKS_SERVER_HOSTNAME, and DATABRICKS_HTTP_PATH.");
}
if (!tableSpec) {
throw new Error("Cannot find table spec in the format catalog.schema.table. " +
"Check the environment variable DATABRICKS_TABLE_SPEC."
)
}
getDBSQLClientWithPAT(token, serverHostname, httpPath)
.then(async client => {
const result = await getAllColumnsFromTable(client, tableSpec, 2);
printResult(result);
await client.close();
})
.catch((error) => {
console.error(error);
});
يختبر الملف التالي المسمى helpers.test.js
ما إذا كانت الدالة getAllColumnsFromTable
ترجع الاستجابة المتوقعة. بدلا من إنشاء اتصال حقيقي بمساحة العمل الهدف، يقوم هذا الاختبار بالسخرية من كائن DBSQLClient
. كما يسخر الاختبار من بعض البيانات التي تتوافق مع المخطط والقيم الموجودة في البيانات الحقيقية. يقوم الاختبار بإرجاع البيانات المقلدة من خلال الاتصال الوهمي ثم يتحقق مما إذا كانت إحدى قيم صفوف البيانات المقلدة تطابق القيمة المتوقعة.
// helpers.test.js
const { getDBSQLClientWithPAT, getAllColumnsFromTable, printResult} = require('./helpers')
jest.mock('@databricks/sql', () => {
return {
DBSQLClient: jest.fn().mockImplementation(() => {
return {
connect: jest.fn().mockResolvedValue({ mock: 'DBSQLClient'})
};
}),
};
});
test('getDBSQLClientWithPAT returns mocked Promise<DBSQLClient> object', async() => {
const result = await getDBSQLClientWithPAT(
token = 'my-token',
serverHostname = 'mock-server-hostname',
httpPath = 'mock-http-path'
);
expect(result).toEqual({ mock: 'DBSQLClient' });
});
const data = [
{
tpep_pickup_datetime: new Date(2016, 1, 13, 15, 51, 12),
tpep_dropoff_datetime: new Date(2016, 1, 13, 16, 15, 3),
trip_distance: 4.94,
fare_amount: 19.0,
pickup_zip: 10282,
dropoff_zip: 10171
},
{
tpep_pickup_datetime: new Date(2016, 1, 3, 17, 43, 18),
tpep_dropoff_datetime: new Date(2016, 1, 3, 17, 45),
trip_distance: 0.28,
fare_amount: 3.5,
pickup_zip: 10110,
dropoff_zip: 10110
}
];
const mockDBSQLClientForSession = {
openSession: jest.fn().mockResolvedValue({
executeStatement: jest.fn().mockResolvedValue({
fetchAll: jest.fn().mockResolvedValue(data),
close: jest.fn().mockResolvedValue(null)
}),
close: jest.fn().mockResolvedValue(null)
})
};
test('getAllColumnsFromTable returns the correct fare_amount for the second mocked data row', async () => {
const result = await getAllColumnsFromTable(
client = mockDBSQLClientForSession,
tableSpec = 'mock-table-spec',
rowCount = 2);
expect(result[1].fare_amount).toEqual(3.5);
});
global.console.table = jest.fn();
test('printResult mock prints the correct fare_amount for the second mocked data row', () => {
printResult(data);
expect(console.table).toHaveBeenCalledWith(data);
expect(data[1].fare_amount).toBe(3.5);
});
بالنسبة ل TypeScript، تبدو التعليمات البرمجية السابقة مشابهة. لاختبار Jest مع TypeScript، استخدم ts-jest.
الموارد الإضافية
- Databricks SQL Driver لمستودع Node.js على GitHub
- بدء استخدام برنامج تشغيل Databricks SQL ل Node.js
- استكشاف أخطاء برنامج تشغيل Databricks SQL وإصلاحها Node.js
مرجع واجهة برمجة التطبيقات
الفصول
DBSQLClient
فصل
نقطة الإدخال الرئيسية للتفاعل مع قاعدة بيانات.
الأساليب
طريقة connect
فتح اتصال بقاعدة البيانات.
المعلمات |
---|
خيارات النوع: ConnectionOptions مجموعة الخيارات المستخدمة للاتصال بقاعدة البيانات. host path يجب ملء الحقول المطلوبة الأخرى و و. راجع المصادقة.مثال: const client: DBSQLClient = new DBSQLClient(); client.connect( { host: serverHostname, path: httpPath, // ... } ) |
المرتجعات: Promise<IDBSQLClient>
طريقة openSession
يفتح جلسة العمل بين DBSQLClient وقاعدة البيانات.
المعلمات |
---|
طلب النوع: OpenSessionRequest مجموعة من المعلمات الاختيارية لتحديد المخطط الأولي والكتالوج الأولي مثال: const session = await client.openSession( {initialCatalog: 'catalog'} ); |
المرتجعات: Promise<IDBSQLSession>
طريقة getClient
إرجاع كائن TCLIService.Client الداخلي. يجب استدعاء بعد اتصال DBSQLClient.
لا توجد معلمات
رجوع TCLIService.Client
طريقة close
إغلاق الاتصال بقاعدة البيانات وإصدار كافة الموارد المقترنة على الخادم. أي استدعاءات إضافية لهذا العميل ستطرح خطأ.
لا توجد معلمات.
لا توجد قيمة إرجاع.
DBSQLSession
فصل
يتم استخدام DBSQLSessions بشكل أساسي لتنفيذ عبارات مقابل databbase بالإضافة إلى عمليات جلب بيانات التعريف المختلفة.
الأساليب
طريقة executeStatement
تنفيذ عبارة مع الخيارات المتوفرة.
المعلمات |
---|
بيان النوع: str العبارة التي سيتم تنفيذها. |
خيارات النوع: ExecuteStatementOptions مجموعة من المعلمات الاختيارية لتحديد مهلة الاستعلام، والحد الأقصى للصفوف للنتائج المباشرة، وما إذا كان سيتم تشغيل الاستعلام بشكل غير متزامن. يتم تعيين افتراضيا maxRows إلى 10000. إذا maxRows تم تعيين إلى null، تشغيل العملية مع إيقاف تشغيل ميزة النتائج المباشرة.مثال: const session = await client.openSession( {initialCatalog: 'catalog'} ); queryOperation = await session.executeStatement( 'SELECT "Hello, World!"', { runAsync: true } ); |
المرتجعات: Promise<IOperation>
طريقة close
إغلاق جلسة العمل. يجب أن يتم ذلك بعد استخدام جلسة العمل.
لا توجد معلمات.
لا توجد قيمة إرجاع.
طريقة getId
إرجاع GUID لجلسة العمل.
لا توجد معلمات.
المرتجعات: str
طريقة getTypeInfo
إرجاع معلومات حول أنواع البيانات المدعومة.
المعلمات |
---|
طلب النوع: TypeInfoRequest معلمات الطلب. |
المرتجعات: Promise<IOperation>
طريقة getCatalogs
يحصل على قائمة الكتالوجات.
المعلمات |
---|
طلب النوع: CatalogsRequest معلمات الطلب. |
المرتجعات: Promise<IOperation>
طريقة getSchemas
يحصل على قائمة المخططات.
المعلمات |
---|
طلب النوع: SchemasRequest معلمات الطلب. يمكن استخدام الحقول catalogName و schemaName لأغراض التصفية. |
المرتجعات: Promise<IOperation>
طريقة getTables
الحصول على قائمة الجداول.
المعلمات |
---|
طلب النوع: TablesRequest معلمات الطلب. الحقول catalogName و و schemaName tableName يمكن استخدامها للتصفية. |
المرتجعات: Promise<IOperation>
طريقة getFunctions
الحصول على قائمة الجداول.
المعلمات |
---|
طلب النوع: FunctionsRequest معلمات الطلب. الحقل functionName مطلوب. |
المرتجعات: Promise<IOperation>
طريقة getPrimaryKeys
الحصول على قائمة المفاتيح الأساسية.
المعلمات |
---|
طلب النوع: PrimaryKeysRequest معلمات الطلب. الحقول schemaName والمطلوبة tableName . |
المرتجعات: Promise<IOperation>
طريقة getCrossReference
الحصول على معلومات حول المفاتيح الخارجية بين جدولين.
المعلمات |
---|
طلب النوع: CrossReferenceRequest معلمات الطلب. يجب تحديد اسم المخطط والأصل والكتالوج لكلا الجدولين. |
المرتجعات: Promise<IOperation>
DBSQLOperation
فصل
يتم إنشاء عمليات DBSQL بواسطة DBSQLSessions ويمكن استخدامها لجلب نتائج العبارات والتحقق من تنفيذها. يتم جلب البيانات من خلال وظائف إحضار المجموعة وجلب الكل.
الأساليب
طريقة getId
إرجاع GUID للعملية.
لا توجد معلمات.
المرتجعات: str
طريقة fetchAll
ينتظر اكتمال العملية، ثم يجلب جميع الصفوف من العملية.
المعلمات: بلا
المرتجعات: Promise<Array<object>>
طريقة fetchChunk
ينتظر اكتمال العملية، ثم يجلب ما يصل إلى عدد محدد من الصفوف من عملية.
المعلمات |
---|
خيارات النوع: FetchOptions الخيارات المستخدمة للإحضار. حاليا، الخيار الوحيد هو maxRows، والذي يتوافق مع الحد الأقصى لعدد كائنات البيانات التي سيتم إرجاعها في أي صفيف معين. |
المرتجعات: Promise<Array<object>>
طريقة close
إغلاق العملية وإصدار كافة الموارد المقترنة. يجب أن يتم ذلك بعد عدم استخدام العملية.
لا توجد معلمات.
لا توجد قيمة إرجاع.