إنشاء دالة (SQL)

هام

هذه الميزة في المعاينة العامة.

ملاحظة

متوفر في Databricks وقت التشغيل 9.1 وما فوق.

إنشاء دالة SQL أو جدول يأخذ مجموعة من الوسائط وإرجاع قيمة تحجيمية أو مجموعة من الصفوف.

بناء الجملة

CREATE [OR REPLACE] [TEMPORARY] FUNCTION [IF NOT EXISTS]
    [database_name.] function_name ([function_parameter[,...]])
    RETURNS {data_type | TABLE (function_parameter[,...])
    [characteristic...]
    RETURN { expression | query }

function_parameter:
    param_name data_type [COMMENT parameter_comment]

characteristic:
    LANGUAGE SQL
  | [NOT] DETERMINISTIC
  | COMMENT function_comment
  | [CONTAINS SQL | READS SQL DATA]

المعلمات

  • أو استبدال

    إذا تم تحديد، يتم استبدال الدالة بنفس الاسم والتوقيع (عدد المعلمات وأنواع المعلمات). لا يمكنك استبدال دالة موجودة بتوقيع مختلف. هذا مفيد بشكل أساسي لتحديث نص الدالة ونوع إرجاع الدالة. لا يمكنك تحديد هذه المعلمة باستخدام IF NOT EXISTS .

  • مؤقت

    نطاق الدالة التي يتم إنشاؤها. عند تحديد TEMPORARY ، تكون الدالة التي تم إنشاؤها صالحة ومرئية في جلسة العمل الحالية. يتم إجراء أي إدخال مستمر في الكتالوج.

  • إذا لم يكن موجودا

    إذا تم تحديد، ينشئ الدالة فقط عندما لا يكون موجودا. نجاح إنشاء الدالة (يتم طرح أي خطأ) إذا كانت الدالة المحددة موجودة بالفعل في النظام. لا يمكنك تحديد هذه المعلمة باستخدام OR REPLACE .

  • [database_name]. function_name

    اسم الدالة التي سيتم إنشاؤها. للحصول على دالة دائمة، يمكنك اختياريا تأهيل اسم الدالة باسم قاعدة بيانات.

  • function_parameter

    قائمة المعلمات دالة اختيارية. تتكون معلمة دالة من اسم ونوع بيانات صالح وتعليق اختياري. إذا لم تأخذ الدالة أي معلمة، استخدم قائمة معلمات فارغة () .

  • إرجاع data_type

    نوع بيانات الإرجاع للدالة التحجيمية.

  • إرجاع الجدول (function_parameter[,...])

    توقيع نتيجة دالة الجدول.

  • RETURN {| التعبير استعلام }

    جسم الوظيفة. بالنسبة لدالة مقياسية، يمكن أن تكون إما استعلاما أو تعبيرا. بالنسبة لدالة جدول، يمكن أن تكون استعلاما فقط. لا يمكن أن يحتوي التعبير على:

    • دالات التجميع والنافذة
    • دالات إنتاج الصف مثل explode

عبارات مميزة اختيارية

جميع البنود المميزة اختيارية. يمكنك تحديد أي عدد منها في أي ترتيب، ولكن يمكنك تحديد كل بند مرة واحدة فقط.

  • SQL اللغة

    لغة الدالة. SQL هي اللغة الوحيدة المدعومة.

  • [لا] القطعيه

    ما إذا كانت الدالة حتمية أم لا. الدالة هي deterministic عندما تقوم بإرجاع نتيجة واحدة فقط لمجموعة محددة من المعلمات.

  • تعليق function_comment

    تعليق للدالة.

  • يحتوي على SQL | يقرأ بيانات SQL

    ما إذا كانت الدالة تقرأ البيانات بشكل مباشر أو غير مباشر من جدول أو طريقة عرض. عندما تقرأ الدالة SQL البيانات، لا يمكنك تحديد CONTAINS SQL . إذا لم تحدد أي من الشرطتين، يتم اشتقاق الخاصية من نص الدالة.

أمثلة

إنشاء وظيفة SQL تحجيمية واستخدامها

CREATE VIEW t(c1, c2) AS VALUES (0, 1), (1, 2);
-- Create a temporary function with no parameter.
CREATE TEMPORARY FUNCTION hello() RETURNS STRING RETURN 'Hello World!';

SELECT hello();
+------------+
|hello()     |
+------------+
|Hello World!|
+------------+

-- Create a permanent function with parameters.
CREATE FUNCTION area(x DOUBLE, y DOUBLE) RETURNS DOUBLE RETURN x * y;

-- Use a SQL function in the SELECT clause of a query.
SELECT area(c1, c2) AS area FROM t;
+----+
|area|
+----+
|0.0 |
|2.0 |
+----+

-- Use a SQL function in the WHERE clause of a query.
SELECT * FROM t WHERE area(c1, c2) > 0;
+---+---+
|c1 |c2 |
+---+---+
|1  |2  |
+---+---+

-- Compose SQL functions.
CREATE FUNCTION square(x DOUBLE) RETURNS DOUBLE RETURN area(x, x);

SELECT c1, square(c1) AS square FROM t;
+---+------+
|c1 |square|
+---+------+
|0  |0.0   |
|1  |1.0   |
+---+------+

-- Create a non-deterministic function.
CREATE FUNCTION dice(n INT) RETURNS INT
NOT DETERMINISTIC
COMMENT 'a n-sided dice'
RETURN FLOOR((RAND() * n) + 1);

SELECT dice(6) AS dice_6;
+------+
|dice_6|
+------+
|3     |
+------+

-- Create a SQL function with a scalar subquery.
CREATE VIEW scores(player, score) AS VALUES (0, 1), (0, 2), (1, 2), (1, 5);

CREATE FUNCTION avg_score(p INT) RETURNS FLOAT
COMMENT 'get an average score of the player'
RETURN SELECT AVG(score) FROM scores WHERE player = p;

SELECT c1, avg_score(c1) AS avg_score FROM t;
+---+---------+
|c1 |avg_score|
+---+---------+
|0  |1.5      |
|1  |3.5      |
+---+---------+

إنشاء وظيفة جدول SQL واستخدامها

-- Create an employee table.
CREATE TABLE employee (id INT, name STRING, deptno INT);
INSERT INTO employee VALUES
    (101, 'John', 1),
    (102, 'Lisa', 2),
    (103, 'Paul', 3),
    (104, 'Evan', 4),
    (105, 'Chloe', 5),
    (106, 'Amy', 6);

-- Create a department table.
CREATE TABLE department (deptno INT, deptname STRING);
INSERT INTO department VALUES
    (1, 'Marketing'),
    (2, 'Sales'),
    (3, 'Engineering');

-- Create a SQL table function to get all employees with a given department number.
CREATE FUNCTION getemps(deptno INT)
RETURNS TABLE(id INT, name STRING)
COMMENT 'Get all employees with the department number'
RETURN SELECT id, name FROM employee e WHERE e.deptno = getemps.deptno

-- Use a SQL table function.
SELECT * FROM getemps(1);
+---+----+
|id |name|
+---+----+
|101|John|
+---+----+

-- Use a SQL table function with LATERAL.
SELECT getemps.* FROM department d, LATERAL getemps(d.deptno);
+---+----+
|id |name|
+---+----+
|101|John|
|102|Lisa|
|103|Paul|
+---+----+

استبدال دالة SQL

-- Replace a SQL scalar function.
CREATE OR REPLACE FUNCTION square(x DOUBLE) RETURNS DOUBLE RETURN x * x;

-- Replace a SQL table function.
CREATE OR REPLACE FUNCTION getemps(deptno INT)
RETURNS TABLE (name STRING)
RETURN SELECT name FROM employee e WHERE e.deptno = getemps.deptno;

ملاحظة

لا يمكنك استبدال دالة موجودة بتوقيع مختلف.

وصف دالة SQL

DESCRIBE FUNCTION hello();
+----------------+
|function_desc   |
+----------------+
|Function: hello |
|Type:     SCALAR|
|Input:    ()    |
|Returns:  STRING|
+----------------+

DESCRIBE FUNCTION area;
+----------------------+
|function_desc         |
+----------------------+
|Function: default.area|
|Type:     SCALAR      |
|Input:    x DOUBLE    |
|          y DOUBLE    |
|Returns:  DOUBLE      |
+----------------------+

DESCRIBE FUNCTION dice;
+----------------------+
|function_desc         |
+----------------------+
|Function: default.dice|
|Type:     SCALAR      |
|Input:    n INT       |
|Returns:  INT         |
+----------------------+

DESCRIBE FUNCTION EXTENDED dice;
+-------------------------------------------+
|function_desc                              |
+-------------------------------------------+
|Function:      default.dice                |
|Type:          SCALAR                      |
|Input:         n INT                       |
|Returns:       INT                         |
|Comment:       a n-sided dice              |
|Deterministic: false                       |
|Owner:         user                        |
|Create Time:   Fri Apr 16 10:00:00 PDT 2021|
|Body:          FLOOR((RAND() * n) + 1)     |
+-------------------------------------------+

-- Describe a SQL table function.
DESCRIBE FUNCTION getemps;
+-------------------------+
|function_desc            |
+-------------------------+
|Function: default.getemps|
|Type:     TABLE          |
|Input:    deptno INT     |
|Returns:  id   INT       |
|          name STRING    |
+-------------------------+