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;
下面是我用于检查目的的插入语句。当 VAL1
和 VAL2
中的任何一个值为 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
。
我有一个自定义 UDF 函数 (check_error),它将 Map
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;
下面是我用于检查目的的插入语句。当 VAL1
和 VAL2
中的任何一个值为 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
。