用户定义的会话参数

使用用户定义的会话参数,可以编写比 Vertica 提供的参数更通用的参数。您可以使用以下方法配置用户定义的会话参数:

  • 从客户端 — 例如,使用 ALTER SESSION

  • 通过 UDx 自身

用户定义的会话参数可以传递到受 Vertica 支持的任何类型的 UDx。您还可以在会话级别为您的 UDx 设置参数。通过指定用户定义的会话参数,您可以持续保存参数状态。甚至当 UDx 在单个会话期间被多次调用时,Vertica 也可以保存参数状态。

RowCount 示例使用用户定义的会话参数。此参数会计算出每次运行时 UDx 处理的行的总数。然后,RowCount 会显示所有执行操作处理的行的总数。有关如何实施,请参阅 C++ 示例:使用会话参数Java 示例:使用会话参数

查看用户定义的会话参数

输入以下命令以查看所有会话参数的值:

=> SHOW SESSION UDPARAMETER all;
schema | library | key | value
--------+---------+-----+-------
(0 rows)

尚未设置任何值,因此该表为空。现在执行 UDx:

=> SELECT RowCount(5,5);
RowCount
----------
10
(1 row)

再次输入命令,查看会话参数的值:

=> SHOW SESSION UDPARAMETER all;
schema |  library  |   key    | value
--------+-----------+----------+-------
public | UDSession | rowcount | 1
(1 row)

库列显示包含 UDx 的库的名称。这是使用 CREATE LIBRARY 设置的名称。因为 UDx 已经处理了一行,所以 rowcount 会话参数的值当前为 1。再运行两次 Udx 应将该值增加 2。

=> SELECT RowCount(10,10);
RowCount
----------
20
(1 row)
=> SELECT RowCount(15,15);
RowCount
----------
30
(1 row)

现在您已经执行了三次 UDx,获取了 5 + 5、10 + 10 和 15 + 15 的总和。现在,检查 rowcount 的值。

=> SHOW SESSION UDPARAMETER all;
schema |  library  |   key    | value
--------+-----------+----------+-------
public | UDSession | rowcount | 3
(1 row)

更改用户定义的会话参数

您还可以手动更改 rowcount 的值。为此,请输入以下命令:

=> ALTER SESSION SET UDPARAMETER FOR UDSession rowcount = 25;
ALTER SESSION

检查 RowCount 的值:

=> SHOW SESSION UDPARAMETER all;
schema |  library  |   key    | value
--------+-----------+----------+-------
public | UDSession | rowcount | 25
(1 row)

清除用户定义的会话参数

从客户端

要清除 rowcount 的当前值,请输入以下命令:

=> ALTER SESSION CLEAR UDPARAMETER FOR UDSession rowcount;
ALTER SESSION

确认 rowcount 已被清除:

=> SHOW SESSION UDPARAMETER all;
schema | library | key | value
--------+---------+-----+-------
(0 rows)

通过 C++ UDx

可以将会话参数通过 UDx 自身进行清除。例如,要在其值达到 10 或更大值时清除 rowcount,请执行下列操作:

  1. 从 RowCount 类的 destroy() 方法中移除以下行:

    udParams.getUDSessionParamWriter("library").getStringRef("rowCount").copy(i_as_string);
    
  2. 将已从 destroy() 方法中移除的行替换为以下代码:

    
    if (rowCount < 10)
    {
    udParams.getUDSessionParamWriter("library").getStringRef("rowCount").copy(i_as_string);
    }
    else
    {
    udParams.getUDSessionParamWriter("library").clearParameter("rowCount");
    }
    
  3. 要查看 Udx 是否已清除会话参数,请将 rowcount 的值设置为 9:

    => ALTER SESSION SET UDPARAMETER FOR UDSession rowcount = 9;
    ALTER SESSION
    
  4. 检查 rowcount 的值:

    => SHOW SESSION UDPARAMETER all;
     schema |  library  |   key    | value
    --------+-----------+----------+-------
     public | UDSession | rowcount | 9
     (1 row)
    
  5. 调用 RowCount,使它的值变成 10:

    => SELECT RowCount(15,15);
    RowCount
    ----------
          30
     (1 row)
    
  6. 再次检查 rowcount 的值。由于值已达到 10(即 UDx 中指定的阈值),因此可认为 rowcount 已被清除:

    => SHOW SESSION UDPARAMETER all;
     schema | library | key | value
    --------+---------+-----+-------
     (0 rows)
    

    正如预计的那样,RowCount 已被清除。

通过 Java UDx

  1. 从 RowCount 类的 destroy() 方法中移除以下行:

    udParams.getUDSessionParamWriter("library").setString("rowCount", Integer.toString(rowCount));
    srvInterface.log("RowNumber processed %d records", count);
    
  2. 将已从 destroy() 方法中移除的行替换为以下代码:

    
    if (rowCount < 10)
    {
    udParams.getUDSessionParamWriter("library").setString("rowCount", Integer.toString(rowCount));
    srvInterface.log("RowNumber processed %d records", count);
    }
    else
    {
    udParams.getUDSessionParamWriter("library").clearParameter("rowCount");
    }
    
  3. 要查看 Udx 是否已清除会话参数,请将 rowcount 的值设置为 9:

    => ALTER SESSION SET UDPARAMETER FOR UDSession rowcount = 9;
    ALTER SESSION
    
  4. 检查 rowcount 的值:

    => SHOW SESSION UDPARAMETER all;
     schema |  library  |   key    | value
    --------+-----------+----------+-------
     public | UDSession | rowcount | 9
     (1 row)
    
  5. 调用 RowCount,使它的值变成 10:

    => SELECT RowCount(15,15);
    RowCount
    ----------
           30
     (1 row)
    
  6. 检查 rowcount 的值。由于值已达到 10(即 UDx 中指定的阈值),因此可认为 rowcount 已被清除:

    => SHOW SESSION UDPARAMETER all;
     schema | library | key | value
    --------+---------+-----+-------
     (0 rows)
    

正如预计的那样,rowcount 已被清除。

只读会话参数和隐藏的会话参数

如果不想在 UDx 之外的其他地方设置参数,您可以将其设为只读。此外,如果不想让参数在客户端内可见,您可以将其设为隐藏。

将参数变为只读,就意味着它不能在客户端中设置,但是可以进行查看。要将参数变为只读,请在参数名称前面添加单下划线。例如,要将 rowCount 变为只读,请将 UDx 中的所有“rowCount”实例更改为“_rowCount”。

将参数设为隐藏,就意味着它不能在客户端中查看,也不能设置。要将参数设为隐藏,请在参数名称前面添加两个下划线。例如,要将 rowCount 变为隐藏,请将 UDx 中的所有“rowCount”实例更改为“__rowCount”。

另请参阅

Kafka 用户定义的会话参数