Skip to main content
The information below includes all the information one needs to know to begin writing UDFs using the Python UDF API. For more information on running Python UDFs, see Running Python UDFs.

Dependencies

To begin writing Python UDFs, access to the Kinetica Python UDF API is required. In default Kinetica installations, the Python UDF API is located in the /opt/gpudb/udf/api/python directory. The API can be downloaded from the Python UDF API repo on GitHub. After downloading, see the README.md in the UDF API directory created for further setup instructions. Instructions for installing & configuring the API can be found under UDF API Installation below. The Python UDF API consists of one file, kinetica_proc.py. This needs to be included in the UDF source code and added to the PYTHONPATH. There are no external dependencies beyond the Python standard library. To take advantage of GPU processing within a UDF, the CUDA Toolkit must be downloaded & installed from the Nvidia Developer Zone. Also, any Python packages the UDF may need to use should be installed on the development platform and be made available within the Kinetica cluster’s UDF environment using function environments.

UDF API Installation

The Kinetica Python UDF API is accessible via GitHub.
  1. In the desired directory, run the following to download the Kinetica Python UDF API repository:
  2. Add the Python UDF API directory to the PYTHONPATH:

Python UDF Function Environments

Python UDF function environments provide a means for deploying Python packages needed by UDFs to the Kinetica cluster. Each UDF executes in a default function environment running Python 3.10 with a set of Python packages pre-installed. Any user-created function environment will have that default set as well as any added by the user. Function environments can be managed in SQL, the native APIs, and in Workbench.

Installing Function Environment Libraries

To install Python packages within the Kinetica UDF environment, create a function environment and install the packages within it.
Afterwards, when creating the UDF, assign the environment to the UDF.

Uninstalling Function Environment Libraries

To uninstall Python packages from a given function environment:
To delete a function environment:
Be sure to delete all UDFs that use a function environment before deleting it.

Pre-installed Libraries on the Cluster

Each cluster node comes pre-installed with the latest Kinetica APIs:
  • gpudb - Kinetica Python API
  • kinetica-proc - Kinetica Python UDF API
The following 3rd-party libraries are pre-installed on Kinetica cluster nodes, for use by UDFs:

Initializing

A UDF must first get a handle to the ProcData class imported. This will parse the primary control file and set up all the necessary structures. It will return a ProcData instance, which is used to access data. All configuration information is cached, so repeated calls to get a handle to ProcData will not reload any configuration files.
When you get a handle to ProcData, the handle is actually to the data given to that instance (OS process) of the UDF on the Kinetica host; therefore, there will be a ProcData handle for every instance of the UDF on your Kinetica host

Column Types

Unlike the other Kinetica APIs, the Python UDF API does not process data using records or schemas, operating in terms of columns of data instead. The raw column values returned closely map to the data types used in the tables being accessed:

Numeric

String

Date/Time

Binary

Column data values can be accessed through array indices:
For example, to retrieve the value for the 10th record:

Reading Input Data

Accessing the request information for the UDF, the parameters passed into the UDF, or the input data can be completed using the following calls:

Accessing Input Values

The InputDataSet object returned from proc_data.input_data contains the InputTable object, which in turn contains InputColumn, holding the actual data set. Tables and columns can be accessed by index or by name. For example, given a customer table at InputDataSet index 5 and a name column at that InputTable’s index 1, either of the following calls will retrieve the column values associated with customer.name:

Request Info Keys

The request info keys are returned from calling proc_data.request_info. These keys include a variety of details about the executing UDF from the request information map made available to each running UDF.

General Information

CUDA Information

When executing UDFs that utilize CUDA, additional request information is returned.

Data Segment Information

Data is passed into UDFs in segments. Each segment consists of the entirety of the data on a single TOM and is processed by the UDF instance executing on that TOM. Thus, there is a 1-to-1 mapping of data segment and executing UDF instance, though this relationship may change in the future. Running the same UDF multiple times should result in the same set of segments, assuming the same environment and system state across runs.

Kinetica API Connection Parameters

These can be used to connect back to Kinetica using the regular API endpoint calls. Use with caution in distributed UDFs, particularly in large clusters, to avoid overwhelming the head node. Also note, multi-head ingest may not work from a UDF in some cases without overriding the worker URLs to use internal IP addresses.
Since username and password are randomly-generated temporary credentials, for security reasons, they should not be printed or output to logs.

Writing Output Data

To output data to a table, the size of the table must be set in order to allocate enough space in all of the columns to hold the correct number of values. To do this, call:
Table column values can then be assigned to each OutputColumn of each OutputTable in the OutputDataSet. The following calls are available to assist with writing data to Kinetica:

Setting Output Values

The OutputDataSet object returned from proc_data.output_data contains the OutputTable object, which in turn contains OutputColumn, holding the actual data set. Tables and columns are accessed the same way as InputDataSet, by name, index, or a combination of the two:
To assign fixed-width output values:
To assign variable-width output values:

Status Reporting

The proc_data.status property can be set to a string value to help convey status information during UDF execution, e.g., proc_data.status="25% complete". The show_proc_status() function will return any status messages set for each data segment — one data segment per processing node if in distributed mode, or one data segment total in non-distributed mode. These messages are subject to the following scenarios:
  • If the user-provided UDF code is executing and has set a status message, show_proc_status() will return the last message that was set.
  • If the user-provided UDF code finishes executing successfully, the status message is cleared.
    The UDF may not show as “complete” yet since any data written by the UDF (in distributed mode) still has to be inserted into the database, but the status set by the UDF code isn’t relevant to this process
  • If the UDF is killed while executing user-provided UDF code, show_proc_status() will return the last message that was set.
  • If the user-provided UDF code errors out, show_proc_status() will return the error message and the last status message that was set in parentheses.

Complete

The UDF must finish with a call to proc_data.complete. This writes out some final control information to indicate that the UDF completed successfully.
If this call is not made, the database will assume that the UDF didn’t finish and will return an error to the caller.

Logging

Any output from the UDF to is written to two places:
  • The system log file on the head node, which can be viewed in GAdmin on the logging page.
  • The /opt/gpudb/core/logs/gpudb.log file local to the processing node container