如何解决尝试设置 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 举报,一经查实,本站将立刻删除。