Ksqldb 中的 MAP 标量函数问题

MAP scalar function issue in Ksqldb

我有一个自定义 UDF 函数 (check_error),它将 Map 作为输入。在 KSQL 流中,我正在创建一个 MAP 并向 UDF 提供输入。

CREATE STREAM CHECK (VAL1 STRING, VAL2 DECIMAL(3,0)) WITH (KAFKA_TOPIC='CHECK', VALUE_FORMAT='AVRO');
select MAP('VAL1' := VAL1, 'VAL2' := CAST(VAL2 as STRING)) from CHECK emit changes;

下面是我用于检查目的的插入语句。当 VAL1VAL2 中的任何一个值为 NULL 时,MAP 的整个输出变为 null.

insert into check (VAL1, VAL2) VALUES ('my name', 123);
insert into check (VAL2) VALUES (123);
insert into check (VAL1) VALUES ('my name');

实际输出-

{VAL1=my name, VAL2=123}
null
null

首选输出 -

{VAL1=my name, VAL2=123}
{VAL1=null, VAL2=123}
{VAL1=my name, VAL2=null}

这里null不是字符串

这是 KSQLDB 中 MAP 函数的一个特性,只要键中的一个值是 null,它就会使整个映射成为 null?有没有办法获得首选输出?我已经检查并尝试了多种方法,但无法获得首选输出。

如果我使用 IFNULL 函数,那么我能够在输出中获得整个字典,但不是首选输出。

select map('VAL1' := IFNULL(val1, 'null'), 'VAL2' := CASE WHEN val2 IS NULL THEN 'null' WHEN val2 IS NOT NULL THEN CAST(val2 AS STRING) END) from check emit changes;

Output - 
{VAL1=my name, VAL2=123}
{VAL1=null, VAL2=123}
{VAL1=my name, VAL2=null}

注意:这里的 null 是一个字符串

我使用 AS_MAP() 标量函数而不是我在问题中所做的 KSQL 的 MAP 数据类型获得了所需的输出。

使用了新的 KSQL 查询 -

select AS_MAP(ARRAY['VAL1', 'VAL2'], ARRAY[VAL1, CAST(VAL2 as STRING)]) from CHECK emit changes;

ARRAY 用于转换为 list,因为 AS_MAP 函数在其输入中采用 list