Snowflake 类

SNOWFLAKE 数据库还包括 Snowflake 提供的类。

概念

与面向对象编程中的类相似,用作创建实例的蓝图。实例 是从类中创建的对象。类和实例是 Snowflake 中的架构级对象。您可以将类视为可扩展的 Snowflake 对象类型,将实例视为 Snowflake 对象。

类通过存储过程和函数提供公共 API。它们统称为 类方法。类还提供 类角色,用于对类方法启用细粒度权限。除了其公共 API 之外,类还包括私有状态以及私有过程和函数,类似于面向对象编程中的私有属性和方法。类的实现可以随着时间的推移,通过新的 类版本 不断演变。Snowflake 会自动将实例升级到最新的类版本。

例如,Snowflake 在 SNOWFLAKE.ML 架构中提供了 ANOMALY_DETECTION 类。您可以使用 CREATE 命令创建类的实例,就像创建特定对象类型的对象一样。

下面的示例创建了一个类的实例并调用了一个实例方法。

  1. 更新搜索路径,使其包含 SNOWFLAKE.ML

    ALTER SESSION SET SEARCH_PATH = '$current, $public, snowflake.ml';
    
    Copy
  2. 创建 ANOMALY_DETECTION 类的实例:

    CREATE ANOMALY_DETECTION mydatabase.myschema.my_anomaly_detector(...);
    
    Copy
  3. 创建 ANOMALY_DETECTION 类的实例后,可以调用实例方法:

    mydatabase.myschema.my_anomaly_detector!DETECT_ANOMALIES(...);
    
    Copy

备注

目前,类仅由 Snowflake 提供,不能由用户创建。

列出可用的类

您可以使用 SHOW 命令查找可用的类,并了解有关每个类的更多信息。这些命令使您能够:

查找所有类

通过执行 SHOW CLASSES 命令可以列出所有可用的 Snowflake 类:

SHOW CLASSES IN DATABASE SNOWFLAKE;
Copy

该语句的结果包括每个类的数据库和架构名称。

更新搜索路径

类是 SNOWFLAKE 数据库中的架构中的对象。必须使用完全限定的类名称(例如,SNOWFLAKE.ML.ANOMALY_DETECTION)来执行本主题中的后续 SQL 命令。或者,可以更新 搜索路径,使其包含类的数据库和架构,然后通过其非限定名称(例如,ANOMALY_DETECTION)引用该类。

备注

如果更新特定类的搜索路径,则具有相同名称但属于不同类的函数将不再可访问。例如,如果您将 SNOWFLAKE.CORTEX 添加到您的搜索路径,字符串函数 TRANSLATE 将无法访问,因为已存在 SNOWFLAKE.CORTEX.TRANSLATE 函数。

可以使用 ALTER SESSION、ALTER USER 或 ALTER ACCOUNT 修改搜索路径。

命令

备注

ALTER SESSION

仅修改当前会话的搜索路径。您可以在会话级别修改自己的搜索路径。会话级更改会替换账户级或用户级设置。

ALTER USER

持续修改当前或指定用户的搜索路径。您可以在用户级别修改自己的搜索路径。管理员可以修改其他用户的搜索路径。用户级更改会替换账户级或会话级设置。

ALTER ACCOUNT

持续修改账户中所有用户的搜索路径。管理员必须在账户级别修改搜索路径。

  1. 执行以下语句,并从 value 列中复制当前搜索路径:

    SHOW PARAMETERS LIKE 'search_path';
    
    Copy
  2. 更新搜索路径。

    备注

    以下示例使用默认搜索路径 $current, $public。如果上一步 value 列中的搜索路径与默认值不匹配,请编辑下面的示例语句,使其包含您的实际搜索路径。

    例如,要将 SNOWFLAKE.ML 添加到当前会话的搜索路径中,请执行以下语句:

    ALTER SESSION SET SEARCH_PATH = '$current, $public, SNOWFLAKE.ML';
    
    Copy

    要在用户级别将 SNOWFLAKE.ML 添加到您自己的搜索路径中,请执行以下语句:

    ALTER USER SET SEARCH_PATH = '$current, $public, SNOWFLAKE.ML';
    
    Copy

    具有 ACCOUNTADMIN 角色的用户可以通过执行以下语句来更新账户的搜索路径:

    ALTER ACCOUNT SET SEARCH_PATH = '$current, $public, SNOWFLAKE.ML';
    
    Copy

有关 Snowflake 如何解析名称的更多信息,请参阅 对象名称解析

类方法

类通过存储过程和函数提供公共 API。它们统称为类 方法。要列出类的所有方法(包括每个方法所需的实参),请执行 SHOW FUNCTIONS IN CLASSSHOW PROCEDURES IN CLASS 命令。一个类可能包含多个名称相同但签名不同的方法(即,不同数量的实参或实实参据类型)。

备注

本主题中的示例语句使用非限定类名称 ANOMALY_DETECTION 。如果尚未 更新搜索路径 使其包含 SNOWFLAKE.ML,请使用 SNOWFLAKE.ML.ANOMALY_DETECTION 类的完全限定名称。

例如,要列出 SNOWFLAKE.ML.ANOMALY_DETECTION 类中所有可用的函数,请执行以下语句:

SHOW FUNCTIONS IN CLASS ANOMALY_DETECTION;
Copy
+-----------------------+-------------------+-------------------+--------------------------------------------------------------------------+--------------+----------+
| name                  | min_num_arguments | max_num_arguments | arguments                                                                | descriptions | language |
|-----------------------+-------------------+-------------------+--------------------------------------------------------------------------+--------------+----------|
| _DETECT_ANOMALIES_1_1 |                 5 |                 5 | (MODEL BINARY, TS TIMESTAMP_NTZ, Y FLOAT, FEATURES ARRAY, CONFIG OBJECT) | NULL         | Python   |
| _FIT                  |                 3 |                 3 | (TS TIMESTAMP_NTZ, Y FLOAT, FEATURES ARRAY)                              | NULL         | Python   |
| _FIT                  |                 4 |                 4 | (TS TIMESTAMP_NTZ, Y FLOAT, LABEL BOOLEAN, FEATURES ARRAY)               | NULL         | Python   |
+-----------------------+-------------------+-------------------+--------------------------------------------------------------------------+--------------+----------+

要列出 SNOWFLAKE.ML.ANOMALY_DETECTION 类中的所有存储过程,请执行以下语句:

SHOW PROCEDURES IN CLASS ANOMALY_DETECTION;
Copy

以下结果包括会话中当前角色已被授予访问权限的类中的存储过程:

+---------------------------------+-------------------+-------------------+------------------------------------------------------------------------------------------------------------------------------------------+--------------+------------+
| name                            | min_num_arguments | max_num_arguments | arguments                                                                                                                                | descriptions | language   |
|---------------------------------+-------------------+-------------------+------------------------------------------------------------------------------------------------------------------------------------------+--------------+------------|
| __CONSTRUCT                     |                 4 |                 4 | (INPUT_DATA VARCHAR, TIMESTAMP_COLNAME VARCHAR, TARGET_COLNAME VARCHAR, LABEL_COLNAME VARCHAR)                                           | NULL         | Javascript |
| __CONSTRUCT                     |                 5 |                 5 | (INPUT_DATA VARCHAR, SERIES_COLNAME VARCHAR, TIMESTAMP_COLNAME VARCHAR, TARGET_COLNAME VARCHAR, LABEL_COLNAME VARCHAR)                   | NULL         | Javascript |
| DETECT_ANOMALIES                |                 4 |                 4 | (INPUT_DATA VARCHAR, SERIES_COLNAME VARCHAR, TIMESTAMP_COLNAME VARCHAR, TARGET_COLNAME VARCHAR)                                          | NULL         | SQL        |
| DETECT_ANOMALIES                |                 5 |                 5 | (INPUT_DATA VARCHAR, SERIES_COLNAME VARCHAR, TIMESTAMP_COLNAME VARCHAR, TARGET_COLNAME VARCHAR, CONFIG_OBJECT OBJECT)                    | NULL         | SQL        |
| DETECT_ANOMALIES                |                 3 |                 3 | (INPUT_DATA VARCHAR, TIMESTAMP_COLNAME VARCHAR, TARGET_COLNAME VARCHAR)                                                                  | NULL         | SQL        |
| DETECT_ANOMALIES                |                 4 |                 4 | (INPUT_DATA VARCHAR, TIMESTAMP_COLNAME VARCHAR, TARGET_COLNAME VARCHAR, CONFIG_OBJECT OBJECT)                                            | NULL         | SQL        |
| EXPLAIN_FEATURE_IMPORTANCE      |                 0 |                 0 | ()                                                                                                                                       | NULL         | SQL        |
| _CONSTRUCTFEATUREINPUT          |                 6 |                 6 | (INPUT_REF VARCHAR, SERIES_COLNAME VARCHAR, TIMESTAMP_COLNAME VARCHAR, TARGET_COLNAME VARCHAR, LABEL_COLNAME VARCHAR, REF_ALIAS VARCHAR) | NULL         | Javascript |
| _CONSTRUCTINFERENCEFUNCTIONNAME |                 0 |                 0 | ()                                                                                                                                       | NULL         | SQL        |
| _CONSTRUCTINFERENCERESULTAPI    |                 0 |                 0 | ()                                                                                                                                       | NULL         | SQL        |
| _SETTRAININGINFO                |                 0 |                 0 | ()                                                                                                                                       | NULL         | SQL        |
+---------------------------------+-------------------+-------------------+------------------------------------------------------------------------------------------------------------------------------------------+--------------+------------+

类角色

一个类可能具有一个或多个角色,这些角色被授予对某些类方法或所有类方法的 USAGE 权限。您可以使用 SHOW ROLES IN CLASS 命令列出类中的可用角色。

列出 SNOWFLAKE.ML.ANOMALY_DETECTION 类中的所有角色:

SHOW ROLES IN CLASS ANOMALY_DETECTION;
Copy
+-------------------------------+------+---------+
| created_on                    | name | comment |
|-------------------------------+------+---------|
| 2023-06-06 01:06:42.808 +0000 | USER | NULL    |
+-------------------------------+------+---------+

实例角色

角色在类中定义,并在实例中实例化为 实例角色。可以向账户中的角色授予实例角色,以启用对实例方法的访问权限。

例如,如果您在架构 my_db.my_schema 中有一个 ANOMALY_DETECTION 实例 my_anomaly_detector,则可以使用以下语句查看授予实例角色 USER 的权限:

SHOW GRANTS TO SNOWFLAKE.ML.ANOMALY_DETECTION ROLE my_db.my_schema.my_anomaly_detector!USER;
Copy

要将实例角色授予您账户中的角色 my_role,请执行以下语句:

GRANT SNOWFLAKE.ML.ANOMALY_DETECTION ROLE my_db.my_schema.my_anomaly_detector!USER
  TO ROLE my_role;
Copy

上面的语句使角色 my_role 能够执行 ANOMALY_DETECTOR 实例 my_anomaly_detector 的方法。

备注

角色 my_role 还必须对数据库 my_db 和架构 my_schema 具有 USAGE 权限。角色 my_role 还必须对传递给实例方法的对象具有适当权限。

授予创建类实例的权限

为了创建类的实例,必须向角色授予 CREATE <class_name> 权限。

例如,要使 ml_admin 角色能够在 mydb.myschema 架构中创建 SNOWFLAKE.ML.ANOMALY_DETECTION 实例,请执行以下语句:

GRANT CREATE ANOMALY_DETECTION ON SCHEMA mydb.myschema TO ROLE ml_admin;
Copy

创建实例

可以使用 CREATE <object> 命令和类构造函数方法创建类的实例。

备注

无论实例是从哪个类创建的,架构中的实例名称都必须是唯一的。例如,如果您有一个名为 fooBUDGET (SNOWFLAKE.CORE) 类实例,您无法在同一个架构中创建名为 fooANOMALY_DETECTION (SNOWFLAKE.ML) 类实例。

例如,要创建异常检测器 my_anomaly_detector 实例,请执行以下语句:

CREATE ANOMALY_DETECTION <my_anomaly_detector_name>(
  INPUT_DATA => SYSTEM$REFERENCE('VIEW', '<view_with_training_data>'),
  TIMESTAMP_COLUMN => '<timestamp_column_name>'
  TARGET_COLNAME => '<target_column_name>',
  LABEL_COLNAME => ''
);
Copy

使用实例

创建类的实例后,可以调用该类提供的实例方法。调用方法需要使用感叹号 (!) 字符。! 字符用于对实例取消引用。

例如,要调用异常检测器 my_anomaly_detector 的 DETECT_ANOMALIES 方法,请执行以下语句:

CALL my_anomaly_detector!DETECT_ANOMALIES(
  INPUT_DATA => SYSTEM$REFERENCE('VIEW', '<view_name>'),
  TIMESTAMP_COLNAME =>'<timestamp_column_name>',
  TARGET_COLNAME => '<target_column_name>'
);
Copy

可用类

有关可用的 Snowflake 类的列表,请参阅 SQL 类参考

限制

目前不支持 复制 类实例。

语言: 中文