Important
此功能目前以公共预览版提供。
本参考教程介绍如何为 Lakeflow Designer 构建一个 Python UDF 操作器,该操作器会用到 user-defined-operator-v0.1.0 模式中提供的所有 UI 组件。 创建自己的运算符时,将其用作模板。 有关更广泛的概述,请参阅 Lakeflow Designer 中的用户定义的运算符。
概述
此操作器是一个用于演示的 UDF,它使用所有可用的 UI 控件类型来接收参数。 它会将所有输入值串联成一个描述性字符串,方便查看每个小组件如何将数据传递给您的函数。
可用的小组件类型有:
| Widget | Description | 数据类型 |
|---|---|---|
expression |
来自输入端口的列/表达式选择器 | 表达式 |
input |
单行文本输入 | 字符串 |
textarea |
多行文本区域 | 字符串 |
checkbox |
复选框切换 | 布尔 |
toggle |
切换开关 | 布尔 |
number |
具有最小值/最大值的数字输入 | 数字 |
slider |
带范围的数值滑块 | 数字 |
select |
单选下拉列表 (静态值) | 字符串 |
select |
单项选择下拉列表(基于输入列) | 字符串 |
multi-select |
多选(静态值) | string[] |
multi-select |
多项选择(从输入列中) | string[] |
步骤 1:编写和测试Python函数
首先,定义接受所有不同参数类型的Python函数。 此函数只是将所有输入串联到描述性字符串中,以便进行演示。
def concat_all_widgets(
# expression widget - column value from input
expr_value: str,
# input widget - single line text
text_input: str,
# textarea widget - multi line text
text_area: str,
# checkbox widget - boolean
checkbox_flag: bool,
# toggle widget - boolean
toggle_flag: bool,
# number widget - numeric input
number_value: float,
# slider widget - numeric slider
slider_value: float,
# select widget with static options
select_static: str,
# select widget with inputColumns options
select_column: str,
# multi-select widget with static options (array of strings)
multi_select_static: list,
# multi-select widget with inputColumns options (array of strings)
multi_select_columns: list
) -> str:
"""
Concatenates all input parameters into a descriptive string.
This demonstrates all UI widget types available in user-defined operators.
"""
lines = [
f"1: Expression (Column Picker) -> {expr_value}",
f"2: Text Input (Single Line) -> {text_input}",
f"3: Text Area (Multi-Line) -> {text_area}",
f"4: Checkbox Option -> {checkbox_flag}",
f"5: Toggle Switch -> {toggle_flag}",
f"6: Number Input -> {number_value}",
f"7: Slider Value -> {slider_value}",
f"8: Select (Static Options) -> {select_static}",
f"9: Select (From Input Columns) -> {select_column}",
f"10: Multi-Select (Static Options) -> [{', '.join(multi_select_static or [])}]",
f"11: Multi-Select (From Input Columns) -> [{', '.join(multi_select_columns or [])}]"
]
return "\n".join(lines)
使用以下代码测试函数:
result = concat_all_widgets(
expr_value="column_value_123",
text_input="Hello World",
text_area="Line 1\nLine 2\nLine 3",
checkbox_flag=True,
toggle_flag=False,
number_value=42.5,
slider_value=75.0,
select_static="option_b",
select_column="amount",
multi_select_static=["tag1", "tag3"],
multi_select_columns=["col1", "col3"]
)
print(result)
步骤 2:创建 YAML 配置
YAML 配置定义运算符在 Lakeflow Designer 中的显示方式。 此示例演示所有可用的控件类型:
schema: user-defined-operator-v0.1.0
type: uc-udf
name: All Widgets Demo
id: demo.all_widgets
version: '1.0.0'
description: >
A demonstration UDF that showcases all available UI widgets.
config:
type: object
properties:
# ============================================
# EXPRESSION WIDGET
# ============================================
expr_value:
type: string
format: expression
title: 1. Expression (Column Picker)
examples:
- 'Select a column or enter an expression'
x-ui:
widget: expression
port: in
# ============================================
# INPUT WIDGET (single-line text)
# ============================================
text_input:
type: string
title: 2. Text Input (Single Line)
default: default text
examples:
- 'Enter a single line of text'
x-ui:
widget: input
# ============================================
# TEXTAREA WIDGET (multi-line text)
# ============================================
text_area:
type: string
title: 3. Text Area (Multi-Line)
default: Sample text
examples:
- 'Enter multiple lines of text here...'
x-ui:
widget: textarea
rows: 3
# ============================================
# CHECKBOX WIDGET (boolean)
# ============================================
checkbox_flag:
type: boolean
title: 4. Checkbox Option
default: true
x-ui:
widget: checkbox
# ============================================
# TOGGLE WIDGET (boolean switch)
# ============================================
toggle_flag:
type: boolean
title: 5. Toggle Switch
default: false
x-ui:
widget: toggle
# ============================================
# NUMBER WIDGET (numeric input with min/max)
# ============================================
number_value:
type: number
title: 6. Number Input
default: 50
minimum: 0
maximum: 100
examples:
- 'Enter a number (0-100)'
x-ui:
widget: number
# ============================================
# SLIDER WIDGET (numeric slider)
# ============================================
slider_value:
type: number
title: 7. Slider Value
default: 50
minimum: 0
maximum: 100
x-ui:
widget: slider
step: 5
# ============================================
# SELECT WIDGET with STATIC options
# ============================================
select_static:
type: string
title: 8. Select (Static Options)
default: option_a
examples:
- 'Choose an option'
x-ui:
widget: select
optionsSource:
type: static
values:
- option_a
- option_b
- option_c
# ============================================
# SELECT WIDGET with INPUT COLUMNS options
# ============================================
select_column:
type: string
title: 9. Select (From Input Columns)
examples:
- 'Select a column from input'
x-ui:
widget: select
optionsSource:
type: inputColumns
port: in
# ============================================
# MULTI-SELECT WIDGET with STATIC options
# ============================================
multi_select_static:
type: array
items:
type: string
title: 10. Multi-Select (Static Options)
default:
- tag1
- tag2
examples:
- 'Select one or more tags'
x-ui:
widget: multi-select
optionsSource:
type: static
values:
- tag1
- tag2
- tag3
- tag4
- tag5
# ============================================
# MULTI-SELECT WIDGET with INPUT COLUMNS options
# ============================================
multi_select_columns:
type: array
items:
type: string
title: 11. Multi-Select (From Input Columns)
examples:
- 'Select one or more columns'
x-ui:
widget: multi-select
optionsSource:
type: inputColumns
port: in
required:
- expr_value
additionalProperties: false
ports:
input:
- name: in
title: Input Data
output:
- name: out
title: Output
架构亮点
| 配置键 | Widget | 数据类型 | Purpose |
|---|---|---|---|
expr_value |
expression |
表达式 | 从输入数据中选择列或表达式。 |
text_input |
input |
字符串 | 单行文本输入。 |
text_area |
textarea |
字符串 | 多行文本输入。 |
checkbox_flag |
checkbox |
布尔 | 布尔复选框。 |
toggle_flag |
toggle |
布尔 | 布尔切换开关。 |
number_value |
number |
数字 | 带有最小值/最大值校验的数值输入 |
slider_value |
slider |
数字 | 带步进增量的数字滑块。 |
select_static |
select |
字符串 | 带有硬编码选项的下拉列表。 |
select_column |
select |
字符串 | 根据输入列填充的下拉列表。 |
multi_select_static |
multi-select |
string[] | 使用硬编码选项进行多选。 |
multi_select_columns |
multi-select |
string[] | 从输入列填充多选。 |
选项来源类型
对于 select 和 multi-select 小组件,您必须指定一个 optionsSource:
静态选项 - 修复了值列表:
optionsSource:
type: static
values:
- value1
- value2
- value3
输入列 - 输入端口列中的动态列表:
optionsSource:
type: inputColumns
port: in
有关所有可用属性、数据类型、微件和选项的完整指南,请参阅 用户定义操作符 YAML 参考。
步骤 3:创建 Unity 目录函数
将 YAML 配置和Python函数合并为单个 CREATE FUNCTION 语句。 请注意,string[](多选)值会以 ARRAY<STRING> 的形式传递给 UDF。
CREATE OR REPLACE FUNCTION main.my_schema.all_widgets_demo(
expr_value STRING,
text_input STRING,
text_area STRING,
checkbox_flag BOOLEAN,
toggle_flag BOOLEAN,
number_value DOUBLE,
slider_value DOUBLE,
select_static STRING,
select_column STRING,
multi_select_static ARRAY<STRING>,
multi_select_columns ARRAY<STRING>
)
RETURNS STRING
LANGUAGE PYTHON
AS $$
"""
schema: user-defined-operator-v0.1.0
type: uc-udf
name: All Widgets Demo
id: demo.all_widgets
version: "1.0.0"
description: >
A demonstration UDF that showcases all available UI widgets.
config:
type: object
properties:
expr_value:
type: string
format: expression
title: 1. Expression (Column Picker)
examples:
- "Select a column or enter an expression"
x-ui:
widget: expression
port: in
text_input:
type: string
title: 2. Text Input (Single Line)
default: "default text"
examples:
- "Enter a single line of text"
x-ui:
widget: input
text_area:
type: string
title: 3. Text Area (Multi-Line)
default: Sample text
examples:
- "Enter multiple lines of text here..."
x-ui:
widget: textarea
rows: 3
checkbox_flag:
type: boolean
title: 4. Checkbox Option
default: true
x-ui:
widget: checkbox
toggle_flag:
type: boolean
title: 5. Toggle Switch
default: false
x-ui:
widget: toggle
number_value:
type: number
title: 6. Number Input
default: 50
minimum: 0
maximum: 100
examples:
- "Enter a number (0-100)"
x-ui:
widget: number
slider_value:
type: number
title: 7. Slider Value
default: 50
minimum: 0
maximum: 100
x-ui:
widget: slider
step: 5
select_static:
type: string
title: 8. Select (Static Options)
default: option_a
examples:
- "Choose an option"
x-ui:
widget: select
optionsSource:
type: static
values:
- option_a
- option_b
- option_c
select_column:
type: string
title: 9. Select (From Input Columns)
examples:
- "Select a column from input"
x-ui:
widget: select
optionsSource:
type: inputColumns
port: in
multi_select_static:
type: array
items:
type: string
title: 10. Multi-Select (Static Options)
default:
- tag1
- tag2
examples:
- "Select one or more tags"
x-ui:
widget: multi-select
optionsSource:
type: static
values:
- tag1
- tag2
- tag3
- tag4
- tag5
multi_select_columns:
type: array
items:
type: string
title: 11. Multi-Select (From Input Columns)
examples:
- "Select one or more columns"
x-ui:
widget: multi-select
optionsSource:
type: inputColumns
port: in
required:
- expr_value
additionalProperties: false
ports:
input:
- name: in
title: Input Data
output:
- name: out
title: Output
"""
def concat_all_widgets(
expr_value: str,
text_input: str,
text_area: str,
checkbox_flag: bool,
toggle_flag: bool,
number_value: float,
slider_value: float,
select_static: str,
select_column: str,
multi_select_static: list,
multi_select_columns: list
) -> str:
lines = [
f"1: Expression (Column Picker) -> {expr_value}",
f"2: Text Input (Single Line) -> {text_input}",
f"3: Text Area (Multi-Line) -> {text_area}",
f"4: Checkbox Option -> {checkbox_flag}",
f"5: Toggle Switch -> {toggle_flag}",
f"6: Number Input -> {number_value}",
f"7: Slider Value -> {slider_value}",
f"8: Select (Static Options) -> {select_static}",
f"9: Select (From Input Columns) -> {select_column}",
f"10: Multi-Select (Static Options) -> [{', '.join(multi_select_static or [])}]",
f"11: Multi-Select (From Input Columns) -> [{', '.join(multi_select_columns or [])}]"
]
return "\n".join(lines)
return concat_all_widgets(
expr_value,
text_input,
text_area,
checkbox_flag,
toggle_flag,
number_value,
slider_value,
select_static,
select_column,
multi_select_static,
multi_select_columns
)
$$
步骤 4:测试函数
使用 SQL 直接测试 UC 函数:
SELECT main.my_schema.all_widgets_demo(
'my_column_value', -- expr_value (expression)
'Hello World', -- text_input (input)
'Multi\nLine\nText', -- text_area (textarea)
TRUE, -- checkbox_flag (checkbox)
FALSE, -- toggle_flag (toggle)
42.5, -- number_value (number)
75.0, -- slider_value (slider)
'option_b', -- select_static (select with static)
'amount', -- select_column (select with inputColumns)
array('tag1', 'tag3'), -- multi_select_static (multi-select with static)
array('col1', 'col2', 'col3') -- multi_select_columns (multi-select with inputColumns)
) AS result;
步骤 5:注册操作员
将运算符添加到 .user_defined_operators.yaml 文件:
operators:
- catalog: main
schema: my_schema
functionName: all_widgets_demo
步骤 6:设置权限
向需要使用此操作员的用户授予访问权限:
GRANT USE SCHEMA ON SCHEMA main.my_schema TO `<user>`;
GRANT EXECUTE ON FUNCTION main.my_schema.all_widgets_demo TO `<user>`;
在 Lakeflow Designer 中使用运算符
注册后,操作员会显示在 Lakeflow Designer 中,其中包含一个全面的配置窗格,其特征包括:
- 用于列选择的表达式选择器
- 文本输入(单行和多行)
- 布尔控件(复选框和切换)
- 数字输入(数字字段和滑块)
- 具有静态和动态选项的下拉列表
- 用于选择多个值的多选控件
此运算符可作为一个有用的参考,帮助你理解每种小组件类型如何进行渲染,以及如何将数据传递给你的函数。
组件参考概述
| Widget | 数据类型 | 用户界面选项 |
|---|---|---|
expression |
expression |
port (必需), placeholder |
input |
string |
placeholder |
textarea |
string |
rows、placeholder |
checkbox |
boolean |
placeholder |
toggle |
boolean |
placeholder |
number |
number |
min、max、placeholder |
slider |
number |
min、max、step、placeholder |
select |
string |
optionsSource (必需), placeholder |
multi-select |
string[] |
optionsSource (必需), placeholder |