KSQL从流创建表以获取最新数据

时间:2019-10-05 21:40:46

标签: ksql

我有一个名为“客户”的主题,并且为此创建了一个流

CREATE STREAM customers_stream (customerId INT, isActive BOOLEAN)
  WITH (KAFKA_TOPIC='customers', VALUE_FORMAT='json');

我的customers主题的生产者正在生成一个Integer密钥和一个json值。但是当我看到行键被设置为某个二进制值

ksql> print 'customers';
Format:JSON
{"ROWTIME":1570305904984,"ROWKEY":"\u0000\u0000\u0003�","customerId":1001,"isActive":true}
{"ROWTIME":1570307584257,"ROWKEY":"\u0000\u0000\u0003�","customerId":1002,"isActive":true}

现在,如果我创建一个表,它将导致一行(也许因为行键是相同的?)

CREATE TABLE customers (customerId INT, isActive BOOLEAN)
  WITH (KAFKA_TOPIC='customers', KEY='customerId',VALUE_FORMAT='json');

搜索完网络后,我碰到了这篇文章https://www.confluent.io/stream-processing-cookbook/ksql-recipes/setting-kafka-message-key,并通过重新分配键来创建了一个新流

CREATE STREAM customers_stream2 AS \
 SELECT * FROM customers_stream \
 PARTITION BY customerId;

那么我该如何创建一个具有最新客户数据值的表?

从流创建表会导致错误

CREATE TABLE customers_2_table_active AS
  SELECT CUSTOMERID,ISACTIVE
  FROM customers_stream2;

Invalid result type. Your SELECT query produces a STREAM. Please use CREATE STREAM AS SELECT statement instead.

我需要各个行的最新值,以便另一个微服务可以查询新表。

提前谢谢

1 个答案:

答案 0 :(得分:1)

重命名似乎是正确的方法,但是,不能将STREAM直接转换为TABLE

请注意,将您重新键入密码的流customers_stream2写入了相应的主题。因此,您应该能够从流的主题中创建新的TABLE,以获取每个键的最新值。