在本教程中,你将为 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 |
多选(静态值) | 数组 |
multi-select |
多项选择(从输入列中) | 数组 |
Requirements
在支持Unity Catalog的工作区中访问Lakeflow Designer。 请参阅 先决条件。
在
main目录上执行USE CATALOG,在main上执行CREATE SCHEMA,或者在现有main.example_output架构上执行USE SCHEMA和CREATE FUNCTION。 如果要使用不同的目录或模式,就将全文中的main.example_output替换掉。 请参阅 Unity Catalog 权限参考。可运行 Unity Catalog Python UDF 的计算资源。 请参阅 Unity 目录中的 SQL 和Python用户定义的函数(UDF)。
步骤 1:编写和测试Python函数
首先,定义接受所有不同参数类型的Python函数。 此函数只是将所有输入串联到描述性字符串中,以便进行演示。
def concat_all_widgets(
expression_widget_value: str,
input_widget_value: str,
textarea_widget_value: str,
checkbox_widget_value: bool,
toggle_widget_value: bool,
number_widget_value: float,
slider_widget_value: float,
select_static_widget_value: str,
select_columns_widget_value: str,
multiselect_static_widget_value: list,
multiselect_columns_widget_value: 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) -> {expression_widget_value}",
f"2: Text Input (Single Line) -> {input_widget_value}",
f"3: Text Area (Multi-Line) -> {textarea_widget_value}",
f"4: Checkbox Option -> {checkbox_widget_value}",
f"5: Toggle Switch -> {toggle_widget_value}",
f"6: Number Input -> {number_widget_value}",
f"7: Slider Value -> {slider_widget_value}",
f"8: Select (Static Options) -> {select_static_widget_value}",
f"9: Select (From Input Columns) -> {select_columns_widget_value}",
f"10: Multi-Select (Static Options) -> [{', '.join(multiselect_static_widget_value or [])}]",
f"11: Multi-Select (From Input Columns) -> [{', '.join(multiselect_columns_widget_value or [])}]"
]
return "\n".join(lines)
使用以下代码测试函数:
result = concat_all_widgets(
expression_widget_value="column_value_123",
input_widget_value="Hello World",
textarea_widget_value="Line 1\nLine 2\nLine 3",
checkbox_widget_value=True,
toggle_widget_value=False,
number_widget_value=42.5,
slider_widget_value=75.0,
select_static_widget_value="option_b",
select_columns_widget_value="amount",
multiselect_static_widget_value=["tag1", "tag3"],
multiselect_columns_widget_value=["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
# ============================================
expression_widget_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)
# ============================================
input_widget_value:
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)
# ============================================
textarea_widget_value:
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_widget_value:
type: boolean
title: 4. Checkbox Option
default: true
x-ui:
widget: checkbox
# ============================================
# TOGGLE WIDGET (boolean switch)
# ============================================
toggle_widget_value:
type: boolean
title: 5. Toggle Switch
default: false
x-ui:
widget: toggle
# ============================================
# NUMBER WIDGET (numeric input with min/max)
# ============================================
number_widget_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_widget_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_widget_value:
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_columns_widget_value:
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
# ============================================
multiselect_static_widget_value:
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
# ============================================
multiselect_columns_widget_value:
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:
- expression_widget_value
additionalProperties: false
ports:
input:
- name: in
title: Input Data
output:
- name: out
title: Output
架构亮点
| 配置键 | Widget | 数据类型 | Purpose |
|---|---|---|---|
expression_widget_value |
expression |
字符串 | 从输入数据中选择列或表达式。 |
input_widget_value |
input |
字符串 | 单行文本输入。 |
textarea_widget_value |
textarea |
字符串 | 多行文本输入。 |
checkbox_widget_value |
checkbox |
布尔 | 布尔复选框。 |
toggle_widget_value |
toggle |
布尔 | 布尔切换开关。 |
number_widget_value |
number |
数字 | 带有最小值/最大值校验的数值输入 |
slider_widget_value |
slider |
数字 | 带步进增量的数字滑块。 |
select_static_widget_value |
select |
字符串 | 带有硬编码选项的下拉列表。 |
select_columns_widget_value |
select |
字符串 | 根据输入列填充的下拉列表。 |
multiselect_static_widget_value |
multi-select |
数组 | 使用硬编码选项进行多选。 |
multiselect_columns_widget_value |
multi-select |
数组 | 从输入列填充多选。 |
选项来源类型
对于 select 和 multi-select 小组件,您必须指定一个 optionsSource:
静态选项:固定值列表:
optionsSource:
type: static
values:
- value1
- value2
- value3
输入列:输入端口列中的动态列表:
optionsSource:
type: inputColumns
port: in
关于所有可用的属性、数据类型、控件和选项,请参见 用户自定义操作符 YAML 参考。
步骤 3:创建 Unity 目录函数
将 YAML 配置和Python函数合并为单个 CREATE FUNCTION 语句。 注意,multi-select 值(type: array)作为 ARRAY<STRING> 传递给 UDF。
该示例在 main.example_output 中创建该函数。 如果没有模式,先创建它:
CREATE SCHEMA IF NOT EXISTS main.example_output
CREATE OR REPLACE FUNCTION main.example_output.all_widgets_demo(
expression_widget_value STRING,
input_widget_value STRING,
textarea_widget_value STRING,
checkbox_widget_value BOOLEAN,
toggle_widget_value BOOLEAN,
number_widget_value DOUBLE,
slider_widget_value DOUBLE,
select_static_widget_value STRING,
select_columns_widget_value STRING,
multiselect_static_widget_value ARRAY<STRING>,
multiselect_columns_widget_value 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:
expression_widget_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_value:
type: string
title: 2. Text Input (Single Line)
default: "default text"
examples:
- "Enter a single line of text"
x-ui:
widget: input
textarea_widget_value:
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_value:
type: boolean
title: 4. Checkbox Option
default: true
x-ui:
widget: checkbox
toggle_widget_value:
type: boolean
title: 5. Toggle Switch
default: false
x-ui:
widget: toggle
number_widget_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_value:
type: number
title: 7. Slider Value
default: 50
minimum: 0
maximum: 100
x-ui:
widget: slider
step: 5
select_static_widget_value:
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_columns_widget_value:
type: string
title: 9. Select (From Input Columns)
examples:
- "Select a column from input"
x-ui:
widget: select
optionsSource:
type: inputColumns
port: in
multiselect_static_widget_value:
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
multiselect_columns_widget_value:
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:
- expression_widget_value
additionalProperties: false
ports:
input:
- name: in
title: Input Data
output:
- name: out
title: Output
"""
def concat_all_widgets(
expression_widget_value: str,
input_widget_value: str,
textarea_widget_value: str,
checkbox_widget_value: bool,
toggle_widget_value: bool,
number_widget_value: float,
slider_widget_value: float,
select_static_widget_value: str,
select_columns_widget_value: str,
multiselect_static_widget_value: list,
multiselect_columns_widget_value: list
) -> str:
lines = [
f"1: Expression (Column Picker) -> {expression_widget_value}",
f"2: Text Input (Single Line) -> {input_widget_value}",
f"3: Text Area (Multi-Line) -> {textarea_widget_value}",
f"4: Checkbox Option -> {checkbox_widget_value}",
f"5: Toggle Switch -> {toggle_widget_value}",
f"6: Number Input -> {number_widget_value}",
f"7: Slider Value -> {slider_widget_value}",
f"8: Select (Static Options) -> {select_static_widget_value}",
f"9: Select (From Input Columns) -> {select_columns_widget_value}",
f"10: Multi-Select (Static Options) -> [{', '.join(multiselect_static_widget_value or [])}]",
f"11: Multi-Select (From Input Columns) -> [{', '.join(multiselect_columns_widget_value or [])}]"
]
return "\n".join(lines)
return concat_all_widgets(
expression_widget_value,
input_widget_value,
textarea_widget_value,
checkbox_widget_value,
toggle_widget_value,
number_widget_value,
slider_widget_value,
select_static_widget_value,
select_columns_widget_value,
multiselect_static_widget_value,
multiselect_columns_widget_value
)
$$
步骤 4:测试函数
使用 SQL 直接测试 UC 函数:
SELECT main.example_output.all_widgets_demo(
expression_widget_value => 'my_column_value',
input_widget_value => 'Hello World',
textarea_widget_value => 'Multi\nLine\nText',
checkbox_widget_value => TRUE,
toggle_widget_value => FALSE,
number_widget_value => 42.5,
slider_widget_value => 75.0,
select_static_widget_value => 'option_b',
select_columns_widget_value => 'amount',
multiselect_static_widget_value => array('tag1', 'tag3'),
multiselect_columns_widget_value => array('col1', 'col2', 'col3')
) AS result;
步骤 5:注册操作员
将运算符添加到 .user_defined_operators.yaml 文件:
operators:
- catalog: main
schema: example_output
functionName: all_widgets_demo
Note
如果在用户文件夹中定义此文件,则只会为你显示该文件。 更多信息,请参阅“注册并将您的运算符部署到 Lakeflow Designer”。
步骤 6:设置权限
向需要使用此操作员的用户授予访问权限:
GRANT USE SCHEMA ON SCHEMA main.example_output TO `<user>`;
GRANT EXECUTE ON FUNCTION main.example_output.all_widgets_demo TO `<user>`;
步骤 7:在 Lakeflow Designer 中使用运算符
在可视化数据准备中,打开左侧面板的 操作符菜单,找到 All Widgets Demo 操作符。
把操作符拖到画布上,然后将一个输入连接到它。
双击该操作符以打开其配置面板,然后设置其字段。
选择操作符,在输出面板中预览其结果。
操作员的配置面板包括:
用于列选择的表达式选择器
文本输入(单行和多行)
布尔控件(复选框和切换)
数字输入(数字字段和滑块)
具有静态和动态选项的下拉列表
用于选择多个值的多选控件
此运算符可作为一个有用的参考,帮助你理解每种小组件类型如何进行渲染,以及如何将数据传递给你的函数。
有关每个小组件的数据类型和选项,请参阅 UI 小组件。