创建KSQL流时的键

时间:2019-06-22 19:06:01

标签: apache-kafka ksql

1)在要执行聚合功能的Stream上是否需要Key?我已经阅读了多个博客,并且Confluent还建议聚合功能起作用需要KEY

CREATE STREAM Employee    (EmpId BIGINT,     EmpName VARCHAR,    
DeptId BIGINT,    SAL BIGINT)   WITH (KAFKA_TOPIC='EmpTopic', 
   VALUE_FORMAT='JSON');

在Stream上面定义时,我还没有定义任何KEY(ROWKEY为NULL)。基本主题“ EmpTopic”也不是密钥。

我正在Stream上执行聚合功能。

CREATE TABLE SALBYDEPT AS
    SELECT DeptId, 
             SUM(SAL) 
      FROM Employee 
      GROUP BY DeptId;

请确认在上述流上执行聚合功能是否需要在'Employee'流上使用KEY,即在'Employee'流上使用NOT NULL ROWKEY

2)根据Confluent文档,“使用Windowing,您可以控制如何将具有相同键的有状态操作(如聚合或联接)的记录分组到时间范围内。KSQL跟踪每个记录键的窗口”。请帮助我理解上述声明的含义。是否需要Stream应该具有NOT NULL KEY?

3)将流表上的JOIN保留KEY

CREATE TABLE users 
  (registertime BIGINT, 
   userid VARCHAR, 
   gender VARCHAR, 
   regionid VARCHAR) 
  WITH (KAFKA_TOPIC = 'users', 
        VALUE_FORMAT='JSON', 
        KEY = 'userid');

CREATE STREAM pageviews 
  (viewtime BIGINT, 
   userid VARCHAR, 
   pageid VARCHAR) 
  WITH (KAFKA_TOPIC='pageviews', 
        VALUE_FORMAT='DELIMITED', 
        KEY='pageid', 
        TIMESTAMP='viewtime');

CREATE STREAM pageviews_transformed as 
  SELECT viewtime, 
         userid, 
         pageid, 
         TIMESTAMPTOSTRING(viewtime, 'yyyy-MM-dd HH:mm:ss.SSS') AS timestring 
  FROM pageviews 

CREATE STREAM pageviews_enriched AS 
  SELECT pv.viewtime, 
         pv.userid AS userid, 
         pv.pageid, 
         pv.timestring, 
         u.gender, 
         u.regionid, 
         u.interests, 
         u.contactinfo 
  FROM pageviews_transformed pv 
  LEFT JOIN users u ON pv.userid = u.userid;

Will JOIN on Stream-Table retain the 'UserId' as ROWKEY in the new Stream 'pageviews_enriched'

4)我在Github上的Confluent上看到了几个示例,其中JOIN中使用的Stream不是KEY'ed。但是根据文档,Stream应该让NOT NULL ROWKEY参与JOIN。请确认流中没有NOT NULL ROWKEY。

Stream-Stream连接和Stream-Table连接。在下面的示例中,我正在使用NULL ROWKEY和Table在Stream上执行JOIN。这有效吗?

CREATE TABLE users 
  (registertime BIGINT, 
   userid VARCHAR, 
   gender VARCHAR, 
   regionid VARCHAR) 
  WITH (KAFKA_TOPIC = 'users', 
        VALUE_FORMAT='JSON', 
        KEY = 'userid');

CREATE STREAM pageviews 
  (viewtime BIGINT, 
   userid VARCHAR, 
   pageid VARCHAR) 
  WITH (KAFKA_TOPIC='pageviews', 
        VALUE_FORMAT='DELIMITED', 
        TIMESTAMP='viewtime');

CREATE STREAM pageviews_transformed as 
  SELECT viewtime, 
         userid, 
         pageid, 
         TIMESTAMPTOSTRING(viewtime, 'yyyy-MM-dd HH:mm:ss.SSS') AS timestring 
  FROM pageviews 

CREATE STREAM pageviews_enriched AS 
  SELECT pv.viewtime, 
         pv.userid AS userid, 
         pv.pageid, 
         pv.timestring, 
         u.gender, 
         u.regionid, 
         u.interests, 
         u.contactinfo 
  FROM pageviews_transformed pv 
  LEFT JOIN users u ON pv.userid = u.userid;

1 个答案:

答案 0 :(得分:1)

CREATE TABLE SALBYDEPT AS
   SELECT DeptId, 
            SUM(SAL) 
     FROM Employee 
     GROUP BY DeptId;
     
      
  1. 请确认在上述流上执行聚合功能是否需要在'Employee'流上使用KEY,即在'Employee'流上使用NOT NULL ROWKEY
  2.   

此流上不需要密钥。创建的表的键将为DeptId


  
      
  1. 根据Confluent文档,“使用窗口处理,您可以控制如何将具有相同键的状态操作(如聚合或联接)分组到时间范围内。KSQL跟踪每个记录键的窗口”。请帮助我理解上述声明的含义。是否需要Stream应该具有NOT NULL KEY?
  2.   

这意味着创建聚合时,您可以在一个时间窗口内进行操作,并且该时间窗口是消息键的一部分。例如,您可以选择在一定时间范围内(也许每小时或每天)进行汇总,而不是汇总 all 员工SAL(销售?)。在这种情况下,您将拥有汇总键(DeptId)和 window 键(例如每小时2019-06-23 06:00:002019-06-23 07:00:002019-06-23 08:00:00)等等


  
      
  1. 流表上的JOIN会保留密钥
  2.   

除非您在DDL中包含PARTITION BY,否则它将保留流的密钥。


  
      
  1. 我在Github上的Confluent上看到了几个示例,其中JOIN中使用的Stream不是KEY'ed。但是根据文档,Stream应该让NOT NULL ROWKEY参与JOIN。请确认流中没有NOT NULL ROWKEY。
  2.   

您是否有指向您所引用的特定文档的链接?虽然确实需要键入,但是不需要 stream (KSQL可以在幕后进行处理;我不确定)。