微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

尝试设置 Struct 的属性时出现 TypeErrorNashorn、Kafka Connect 转换器

如何解决尝试设置 Struct 的属性时出现 TypeErrorNashorn、Kafka Connect 转换器

使用 Kafka Connect (6.1.1),我尝试使用 Sergey34/kafka-connect-transformers 调整我的 Kafka 消息,然后再将它们放入 BigQuery(使用 BigQuerySink)。

在我的 connector.properties 中,我将 ScriptEngineTransformer 配置如下(最小化示例):

transforms=scriptenginetransformer
transforms.scriptenginetransformer.type=seko.kafka.connect.transformer.script.ScriptEngineTransformer
transforms.scriptenginetransformer.scrip_engine_name=javascript
transforms.scriptenginetransformer.value.script=function valueTransform(source){ source.foo = 42; return source;}

但在运行时出现以下错误

javax.script.ScriptException: TypeError: Cannot set property "foo" of Struct{a=111,b=222} in <eval> at line number 2

(堆栈跟踪 here

根据我对 JS 的初步理解,我认为应该可以替换或添加属性到结构中,即,以下当然可以正常工作(在沙箱中):

function Foo(x,y) {
    this.x = x;
    this.y = y;
}

foo = new Foo(1,2);
foo.y = 3;
foo.z = 4;

console.log(foo);

看起来我的 (Avro) Kafka 消息 ({a=111,b=222}) 已正确传递给 JS 脚本。那么这个错误意味着什么?

解决方法

如果你需要添加一个静态字段,Kafka 带有一个内置的转换来做到这一点......

关于您的问题,阅读代码,它从不测试或使用具有模式的记录,也从不构建新的 Struct 类型

因此,我认为您的输入仅限于原始模式类型,例如字符串/整数/布尔值

换句话说,"Struct{a=111,b=222}" + "foo" 会“工作正常”,你最终会得到 "Struct{a=111,b=222}foo" 但 Avro 记录的字符串表示 "Struct{a=111,b=222}" 没有 Javascript 属性 {{1 }},所以不能设置

您的替代方案/解决方法是确保您使用标准的 JSONConverter,然后使用 foo 构建一个可以将 JS 属性设置为的对象

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。