Kafka SMT ValueToKey - 如何使用多个值作为键?

Ale*_*lex 7 oracle jdbc apache-kafka apache-kafka-connect confluent-platform

我正在使用 Confluent JDBCSourceConnector 从 Oracle 表中读取数据。我正在尝试使用 SMT 生成由 3 个连接字段组成的密钥。

transforms=createKey
transforms.createKey.type=org.apache.kafka.connect.transforms.ValueToKey
transforms.createKey.fields=BUS_OFC_ID_CD,SO_TYPE,SO_NO
Run Code Online (Sandbox Code Playgroud)

使用上面的转换,我得到了这样的东西:

{"BUS_OFC_ID_CD":"111","SO_TYPE":"I","SO_NO":"55555"}
Run Code Online (Sandbox Code Playgroud)

我想要类似的东西:

111I55555
Run Code Online (Sandbox Code Playgroud)

关于如何仅连接值的任何想法?

小智 5

我无法在属性文件中解决上述问题。因此,解决方法是:

  • 创建一个视图(我们已经必须这样做才能让 mode=timestamp 与我们的 Oracle DB 一起工作)
  • 添加一个额外的字段,其中包含 KEYNAME 的串联值
  • 提取连接的值以用作键。

例如:

CREATE VIEW XX_TEST_V AS 
SELECT BUS_OFC_ID_CD, SO_TYPE, SO_NO, BUS_OFC_ID_CD||SO_TYPE||SO_NO as KEYNAME 
FROM XX_TEST;
Run Code Online (Sandbox Code Playgroud)

这会给你一个 JSON 密钥消息

{"KEYNAME ":"111I55555"}
Run Code Online (Sandbox Code Playgroud)

要剥离 JSON 以仅包含文本,然后在属性文件中完成

例如:

transforms=createKey,extractString
transforms.createKey.type=org.apache.kafka.connect.transforms.ValueToKey
transforms.createKey.fields=KEYNAME
transforms.extractString.type=org.apache.kafka.connect.transforms.ExtractField$Key
transforms.extractString.field=KEYNAME
Run Code Online (Sandbox Code Playgroud)

这应该给你以下作为关键

"111I55555" 
Run Code Online (Sandbox Code Playgroud)

问候彼得