我已经使用KSQL创建了一个流,并从该流中创建了一个聚合表。
{
"ksql":"DROP Stream IF EXISTS StreamLegacyNames; DROP Stream IF EXISTS StreamLegacy; CREATE Stream StreamLegacy (payload STRUCT<AgeYr varchar>)WITH (KAFKA_TOPIC='eip-legacy-13',VALUE_FORMAT='JSON' ); CREATE Stream StreamLegacyNames As Select payload->AgeYr Age from StreamLegacy; Create Table DimAge As SELECT Age FROM StreamLegacyNames Group By Age;",
"streamsProperties":{
"ksql.streams.auto.offset.reset":"earliest"
}
}
将此代码导出到sql表的最简单方法是什么?我们正在使用jdbc连接器作为主题,但是我不清楚这是否适用于聚合的KSQL表(在本示例中为DIMAGE)。
即使我在jdbc connect配置文件中将主题设置为DIMAGE以及以下内容。
value.converter.schemas.enable=false
完整的配置文件是
connector.class=io.confluent.connect.jdbc.JdbcSinkConnector
connection.password=PASSWORD
auto.evolve=true
topics=DIMAGE
tasks.max=1
connection.user=USER
value.converter.schemas.enable=false
auto.create=true
connection.url=jdbc:sqlserver://SERVER
我在连接器中收到以下错误。
Caused by: org.apache.kafka.connect.errors.DataException: JsonConverter with schemas.enable requires "schema" and "payload" fields and may not contain additional fields. If you are trying to deserialize plain JSON data, set schemas.enable=false in your converter configuration.
通过邮递员进行的KSQL查询将KTABLE的格式显示为
{"row":{"columns":["83"]},"errorMessage":null,"finalMessage":null}
{"row":{"columns":["74"]},"errorMessage":null,"finalMessage":null}
{"row":{"columns":["36"]},"errorMessage":null,"finalMessage":null}
答案 0 :(得分:2)
在KSQL中CREATE STREAM foo AS SELECT
(“ CSAS”)时,您将创建一个新的Kafka主题,并用SELECT
语句的结果连续填充它。
因此,您只有一个Kafka主题,在您的情况下称为STREAMLEGACYNAMES
(KSQL通常将对象强制为大写)。您可以使用JDBC Sink connector将此主题流式传输到目标RDBMS,包括MS SQL。
答案 1 :(得分:0)
最后,KTable只是另一个主题。您可以使用KSQL PRINT
或kafka-console-consumer
来查看JDBC Sink连接器将获取哪些数据。
如果您假设KSQL表将与SQL Server表完全匹配,则不会。在SQL Server表中,您将拥有出现在KTable上的每个“事件行”,包括空值,因为JDBC接收器尚不支持删除。
不确定要获得的数据是什么,但是可以做的是对要捕获的事件执行窗口化输出,那么实际上是在向下游数据库中插入了一个小批处理。