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;
答案 0 :(得分:1)
CREATE TABLE SALBYDEPT AS SELECT DeptId, SUM(SAL) FROM Employee GROUP BY DeptId;
- 请确认在上述流上执行聚合功能是否需要在'Employee'流上使用KEY,即在'Employee'流上使用NOT NULL ROWKEY
此流上不需要密钥。创建的表的键将为DeptId
。
- 根据Confluent文档,“使用窗口处理,您可以控制如何将具有相同键的状态操作(如聚合或联接)分组到时间范围内。KSQL跟踪每个记录键的窗口”。请帮助我理解上述声明的含义。是否需要Stream应该具有NOT NULL KEY?
这意味着创建聚合时,您可以在一个时间窗口内进行操作,并且该时间窗口是消息键的一部分。例如,您可以选择在一定时间范围内(也许每小时或每天)进行汇总,而不是汇总 all 员工SAL
(销售?)。在这种情况下,您将拥有汇总键(DeptId
)和 window 键(例如每小时2019-06-23 06:00:00
,2019-06-23 07:00:00
,2019-06-23 08:00:00
)等等
- 流表上的JOIN会保留密钥
除非您在DDL中包含PARTITION BY
,否则它将保留流的密钥。
- 我在Github上的Confluent上看到了几个示例,其中JOIN中使用的Stream不是KEY'ed。但是根据文档,Stream应该让NOT NULL ROWKEY参与JOIN。请确认流中没有NOT NULL ROWKEY。
您是否有指向您所引用的特定文档的链接?虽然确实需要键入表,但是不需要 stream (KSQL可以在幕后进行处理;我不确定)。