这是本节的多页打印视图。 点击此处打印.

返回本页常规视图.

R SDK

Vertica R SDK 扩展了 Vertica 分析数据库的功能,因此您可以利用其他 R 库。开始在 R 中开发用户定义的扩展 (UDx) 之前,您必须在群集中的每个节点上安装适用于 Vertica 的 R 语言包。R SDK 在隔离模式下支持标量和转换函数。其他 UDx 类型不受支持。

以下工作流是 R SDK 的典型工作流:

您可以在 Vertica R SDK 中找到所有类的详细文档。

1 - 安装/升级 Vertica 的 R 语言包

要在 Vertica 中创建 R UDx,请安装与您的服务器版本匹配的 R 语言包。R 语言包含有用来与 Vertica 交互的 R 运行时和关联库。您必须使用此版本的 R 运行时;不能升级它。

您必须在群集中的每个节点上安装 R 语言包。Vertica R 语言包必须是节点上安装的唯一 R 语言包。

Vertica R 语言包先决条件

R 语言包需要许多包才能进行安装和执行。这些依赖项的名称因 Linux 发行版而异。对于支持 Vertica 的 Linux 平台,这些包为:

  • RHEL/CentOS:libfortranxz-libslibgomp

  • SUSE Linux Enterprise Server:libfortran3liblzma5libgomp1

  • Debian/Ubuntu:libfortran3liblzma5libgomp1

  • Amazon Linux 2.0:compat-gcc-48-libgfortranxz-libslibgomp

Vertica 需要高于 7.1 的 libgfortran4 库版本才能创建 R 扩展。libgfortran 库默认包含在 devtoolgcc 包中。

安装 Vertica R 语言包

如果您使用操作系统包管理器而不是 rpm 或 dpkg 命令进行安装,则无需手动安装 R 语言包。适用于每个受支持的 Linux 版本的本机包管理器为:

  • RHEL/CentOS:yum

  • SUSE Linux Enterprise Server:zypper

  • Debian/Ubuntu:apt-get

  • Amazon Linux 2.0:yum

  1. 通过浏览 Vertica 网站,下载 R 语言包。

  2. 支持 (Support) 选项卡上,选择客户下载 (Customer Downloads)

  3. 在系统出现提示时,使用您的 Micro Focus 凭据登录。

  4. 找到并选择适用于您所用的服务器版本的 vertica-R-lang_version.rpmvertica-R-lang_version.deb 文件。R 语言包版本必须与服务器版本在三个小数点上匹配。

  5. 以 root 身份或使用 sudo 安装包:

    • RHEL/CentOS

      $ yum install vertica-R-lang-<version>.rpm
      
    • SUSE Linux Enterprise Server

      $ zypper install vertica-R-lang-<version>.rpm
      
    • Debian

      $ apt-get install ./vertica-R-lang_<version>.deb
      
    • Amazon Linux 2.0

       $ yum install vertica-R-lang-<version>.AMZN.rpm
      

安装程序会将 R 二进制文件放入 /opt/vertica/R

升级 Vertica R 语言包

升级时,您已手动安装的某些 R 包可能无法正常工作且可能需要重新安装。如果不更新包,R 将在包无法使用时返回错误。升级这些包的说明如下所述。

  1. 在升级 Vertica 之前,您必须卸载 R 语言包。卸载语言包时,已手动安装的所有其他 R 包会一直留在 /opt/vertica/R 中,而不会被移除。

  2. 按照将 Vertica 升级到新版本中的详细说明升级您的服务器包。

  3. 更新服务器包后,在每个主机上安装新的 R 语言包。

如果已在每个节点上安装了其他 R 包:

  1. 以 root 身份运行 /opt/vertica/R/bin/R 并执行以下命令:

    > update.packages(checkBuilt=TRUE)
    
  2. 从显示的列表中选择 CRAN 镜像。

  3. 系统会提示您更新具有可用更新的每个包。您必须更新已手动安装且与 R 语言包中的当前 R 版本不兼容的所有包。
    更新:

    • Rcpp

    • Rinside

    此时即会安装选择进行更新的包。使用以下命令退出 R:

    > quit()
    

使用 R 语言编写的 Vertica UDx 函数无需编译,而且升级后无需重新加载 Vertica-R 库和函数。

2 - R 包

除了与 R 捆绑在一起的默认包之外,Vertica R 语言包还包含以下 R 包:

  • Rcpp

  • RInside

  • IpSolve

  • lpSolveAPI

您可以使用以下两种方法之一来安装不包含在 Vertica R 语言包中的其他 R 包。您必须在所有节点上安装相同的包。

安装 R 包

您可以使用以下两种方法之一安装其他 R 包。

使用 install.packages() R 命令:

$ sudo /opt/vertica/R/bin/R
> install.packages("Zelig");

使用 CMD INSTALL:

/opt/vertica/R/bin/R CMD INSTALL <path-to-package-tgz>

安装的包位于:/opt/vertica/R/library

3 - R 和 Vertica 数据类型

将数据传递到 R UDx 或从中传递数据时,支持以下数据类型:

发送到 R 函数时,Vertica 中的 NULL 值会转换为 R NA 值。当从 R 函数返回到 Vertica 时,R NA 值会转换为 Vertica null 值。

4 - 将元数据添加到 R 库

您可以将诸如作者姓名、库版本以及库描述之类的元数据添加到您的库。此元数据可以让您跟踪在 Vertica 分析数据库群集上部署的函数的版本并让您函数的第三方用户了解该函数的创建者。库加载到 Vertica 分析数据库编录之后,库的元数据会出现在 USER_LIBRARIES 系统表中。

可通过在 UDx 的一个源文件中调用 RegisterLibrary() 函数为库声明元数据。如果 UDx 的源文件中存在多个函数调用,则使用在 Vertica 分析数据库加载库时最后解释的函数调用来确定库的元数据。

RegisterLibrary() 函数采用八个字符串参数:

RegisterLibrary(author,
                library_build_tag,
                library_version,
                library_sdk_version,
                source_url,
                description,
                licenses_required,
                signature);
  • author 包含要与库创建相关联的名称(例如自己的名称或公司名称)。

  • library_build_tag 为用于代表库的特定版本的字符串(例如 SVN 修订号或编译库的时间戳)。开发库实例时,跟踪这些库实例很有用。

  • library_version 为库的版本。您可以使用想使用的任何编号或命名方案。

  • library_sdk_version 是已为其编译了库的 Vertica 分析数据库 SDK 库的版本。

  • source_url 为函数用户可从中查找函数详细信息的 URL。这可以是您公司的网站、托管库源代码的 GitHub 页面或您喜欢的任何站点。

  • description 为库的简要描述。

  • licenses_required 为许可信息占位符。您必须为此值传递一个空字符串。

  • signature 为对库进行身份验证的签名的占位符。您必须为此值传递一个空字符串。

以下示例显示如何将元数据添加到 R UDx。


RegisterLibrary("Speedy Analytics Ltd.",
                "1234",
                "1.0",
                "8.1.0",
                "http://www.example.com/sales_tax_calculator.R",
                "Sales Tax R Library",
                "",
                "")

加载库并查询 USER_LIBRARIES 系统表将显示调用 RegisterLibrary 时提供的元数据:

=> CREATE LIBRARY rLib AS '/home/dbadmin/sales_tax_calculator.R' LANGUAGE 'R';
CREATE LIBRARY
=> SELECT * FROM USER_LIBRARIES WHERE lib_name = 'rLib';
-[ RECORD 1 ]-----+---------------------------------------------------------
schema_name       | public
lib_name          | rLib
lib_oid           | 45035996273708350
author            | Speedy Analytics Ltd.
owner_id          | 45035996273704962
lib_file_name     | rLib_02552872a35d9352b4907d3fcd03cf9700a0000000000d3e.R
md5_sum           | 30da555537c4d93c352775e4f31332d2
sdk_version       |
revision          |
lib_build_tag     | 1234
lib_version       | 1.0
lib_sdk_version   | 8.1.0
source_url        | http://www.example.com/sales_tax_calculator.R
description       | Sales Tax R Library
licenses_required |
signature         |
dependencies      |
is_valid          | t
sal_storage_id    | 02552872a35d9352b4907d3fcd03cf9700a0000000000d3e

5 - 为 R 函数设置 null 输入和可变性行为

Vertica 支持为采用 R 编写的 UDx 定义可变性设置和 null 输入设置。这两项设置都有助于提高 R 函数的性能。

可变性设置

可变性设置向 Vertica 优化器描述了该函数的行为。例如,如果输入数据有相同的行,并且您知道 UDx 是不可变的,则可以将 UDx 定义为 IMMUTABLE。这样即可告知 Vertica 优化器,它可以返回对其调用该函数的后续相同行的缓存值,而不是对每个相同的行都运行该函数。

要指示 UDx 的可变性,请将 R 工厂函数的 volatility 参数设置为以下值之一:

如果未定义可变性,则函数会被视为 VOLATILE。

以下示例会在 multiplyTwoIntsFactory 函数中将可变性设置为 STABLE:

multiplyTwoIntsFactory <- function() {
  list(name                  = multiplyTwoInts,
       udxtype               = c("scalar"),
       intype                = c("float","float"),
       outtype               = c("float"),
       volatility            = c("stable"),
       parametertypecallback = multiplyTwoIntsParameters)
}

Null 输入行为

Null 输入设置决定如何响应包含 null 输入的行。例如,您可以选择在任何输入为 null 时返回 null,而不调用函数并让函数处理 NULL 输入。

要指示 UDx 如何响应 NULL 输入,请将 R 工厂函数的 strictness 参数设置为以下值之一:

如果未定义 null 输入行为,则无论是否存在 NULL 值,系统都会对每行数据调用该函数。

以下示例会在 multiplyTwoIntsFactory 函数中将 NULL 输入行为设置为 STRICT:

multiplyTwoIntsFactory <- function() {
  list(name                  = multiplyTwoInts,
       udxtype               = c("scalar"),
       intype                = c("float","float"),
       outtype               = c("float"),
       strictness            = c("strict"),
       parametertypecallback = multiplyTwoIntsParameters)
}