ksql-是否可以从多个主题创建流并获取完整的事件有效负载?

时间:2018-10-30 00:08:07

标签: apache-kafka ksql

我们需要收听多个主题,并在每个主题的事件中寻找特定领域。每个主题事件均采用json格式,并且保证没有json格式的固定字段。需要从所有这些多个主题中筛选事件,并在每个事件有效负载中查找特定字段。如果此字段值匹配特定格式,则将那些事件从不同的主题发送到一个固定的主题,然后由其他使用者进一步处理。

在寻找ksql在这种情况下是否可以帮助我们-我们从多个主题创建一个流,并根据ksql流中的固定列过滤数据,并将其推送到新主题。 我的问题是: 1)是否可以从多个主题创建ksql流? 2)是否可以将主题的完整事件有效负载作为ksql流中的一列获取?

在高级别上(使用错误的ksql语法),我正在寻找类似

CREATE STREAM my_all_topics (myFixedFiedl1 varchar, eventPayload varchar) WITH (value_format = 'json', kafka_topic_LIST='topic1, topic2, topic3');

CREATE STREAM mytopic_stream (myFixedFiedl1 varchar, eventPayload varchar) with (kafka_topic='my-final-topic-name', value_format='json')
as select myFixedField1, eventPayload from my_all_topics where myFixedField1 like 'myprefix%';

2 个答案:

答案 0 :(得分:0)

您不能完全按照自己的意愿来做-KSQL STREAM来自一个和唯一的一个Kafka主题。

但是您可以使用KSQL的INSERT INTO功能来实现所需的功能。

  1. 为您的源主题建模:

    CREATE STREAM source_a (myFixedField1 varchar, eventPayload varchar) WITH (kafka_topic='topic_a', value_format='json')
    CREATE STREAM source_b (myFixedField1 varchar, eventPayload varchar) WITH (kafka_topic='topic_b', value_format='json')
    CREATE STREAM source_c (myFixedField1 varchar, eventPayload varchar) WITH (kafka_topic='topic_c', value_format='json')
    
  2. 基于第一个源主题创建目标主题:

    CREATE STREAM mytopic_stream (myFixedField1 varchar, eventPayload varchar) AS SELECT myFixedField1, eventPayload from source_a where myFixedField1 like 'myprefix%';
    
  3. 指定从其余源主题插入目标主题:

    INSERT INTO mytopic_stream SELECT myFixedField1, eventPayload from source_b where myFixedField1 like 'myprefix%';
    INSERT INTO mytopic_stream SELECT myFixedField1, eventPayload from source_c where myFixedField1 like 'myprefix%';
    

另请参见

答案 1 :(得分:0)

我不确定,但是看来您可以将流与JOIN组合在一起。

CREATE STREAM mytopic_stream AS
    SELECT A.*, B.*, C.*
    FROM stream_A A
        JOIN stream_B B ON A.key = B.key_for_A
        JOIN stream_C C ON A.key = B.key_for_A

如果您还没有在KSQL中注册Kafka主题,那么您将必须首先执行该步骤。