注意
一条完整的ksql语句结束,必须以“;”结尾
在CLI中 要空掉一行又不结束命令语句 ,可以以“\”结尾
但是在script的.sql中用不了“\”
streams, tables, topics, and columns的命名中不支持“-”
不要用引号,在创建命名stream和table时
CREATE STREAM
CREATE STREAM stream_name ( { column_name data_type } [, ...] )
WITH ( property_name = expression [, ...] );
stream中列所支持的数据类型:
BOOLEAN
INTEGER
BIGINT
DOUBLE
VARCHAR
(orSTRING
)ARRAY<ArrayType>
(JSON and AVRO only. Index starts from 0)MAP<VARCHAR, ValueType>
(JSON and AVRO only)STRUCT<FieldName FieldType, ...>
(JSON and AVRO only) STRUCT类型要求我们指定字段列表。 对于每个字段,必须指定字段名称(FieldName)和字段类型(FieldType)。 字段类型可以是任何受支持的KSQL类型,包括复杂类型MAP,ARRAY和STRUCT。 可以使用struct dereference( - >)运算符在表达式中访问STRUCT字段。 有关详细信息,请参阅opertors
KSQL将隐式列ROWTIME和ROWKEY添加到每个stream和table,它们分别代表相应的Kafka消息时间戳和消息密钥。 时间戳具有毫秒精度。
WITH支持的配置信息:
Property | Description |
KAFKA_TOPIC (required) | 支持stream中Kafka topic的名称。 该topic必须已存在于Kafka中。 |
VALUE_FORMAT (required) | 指定topic中消息值的序列化格式。 支持的格式:JSON,DELIMITED(逗号分隔值)和AVRO。 |
KEY | 优化提示:如果Kafkamessage key也作为Kafka消息值中的字段/列出现,则可以设置此属性以将相应的字段/列与隐式ROWKEY列(message key)相关联。 如果设置,KSQL将其用作优化提示,以确定在执行聚合和连接时是否可以避免重新分区。 如果kafka中的key为VARCHAR或STRING,则只能使用此方法。 如果kafka中的message key格式为AVRO或JSON,请不要使用此提示。 有关更多信息,请参阅关键要求 |
TIMESTAMP | 默认情况下,隐式ROWTIME列是Kafka主题中消息的时间戳。 TIMESTAMP属性可用于使用Kafka消息值中的指定字段/列的内容覆盖ROWTIME(类似于Kafka的Streams API中的时间戳提取器)。 时间戳具有毫秒精度。 基于时间的操作(例如窗口化)将根据ROWTIME中的时间戳处理记录。 |
TIMESTAMP_FORMAT | 与TIMESTAMP一起使用。 如果未设置,则假定时间戳字段为bigint。 如果已设置,则TIMESTAMP字段必须是varchar类型,并且具有可以使用java DateTimeFormatter解析的格式。 如果您的时间戳格式具有需要单引号的字符,则可以使用连续的单引号来逃避它们,例如:'yyyy-MM-dd''T''HH:mm:ssX'。 有关时间戳格式的更多信息,请参阅DateTimeFormatter。 |
WINDOW_TYPE | 默认情况下,假定主题包含非窗口数据。 如果数据是窗口化的,即使用包含WINDOW子句的查询使用KSQL创建的,则可以使用WINDOW_TYPE属性来提供窗口类型。 有效值为SESSION,HOPPING`和“TUMBLING”。 |
注意:
要使用Avro,必须启用Schema Registry,并且必须在KSQL服务器配置文件中设置ksql.schema.registry.url。 请参阅为KSQL配置Avro和Schema Registry。
Avro字段名称在KSQL中不区分大小写。 这与KSQL列名称行为相匹配。
举例:
CREATE STREAM pageviews (viewtime BIGINT, user_id VARCHAR, page_id VARCHAR)
WITH (VALUE_FORMAT = 'JSON',
KAFKA_TOPIC = 'my-pageviews-topic');
如果source topic中列的名称是KSQL中的保留字之一,则可以使用后引号来定义列。 这同样适用于STRUCT类型中的字段名称。 例如,如果在上面的示例中我们有另一个名为Properties的字段,它是KSQL中的保留字,可以使用以下语句来声明stream:
CREATE STREAM pageviews (viewtime BIGINT, user_id VARCHAR, page_id VARCHAR, `Properties` VARCHAR)
WITH (VALUE_FORMAT = 'JSON',
KAFKA_TOPIC = 'my-pageviews-topic');
CREATE TABLE
CREATE TABLE table_name ( { column_name data_type } [, ...] )
WITH ( property_name = expression [, ...] );
BOOLEAN
INTEGER
BIGINT
DOUBLE
VARCHAR
(orSTRING
)ARRAY<ArrayType>
(JSON and AVRO only. Index starts from 0)MAP<VARCHAR, ValueType>
(JSON and AVRO only)STRUCT<FieldName FieldType, ...>
(JSON and AVRO only) STRUCT类型要求我们指定字段列表。 对于每个字段,必须指定字段名称(FieldName)和字段类型(FieldType)。 字段类型可以是任何受支持的KSQL类型,包括复杂类型MAP,ARRAY和STRUCT。 可以使用struct dereference( - >)运算符在表达式中访问STRUCT字段。 有关详细信息,请参阅opertors
KSQL将隐式列ROWTIME和ROWKEY添加到每个stream和table,它们分别代表相应的Kafka消息时间戳和消息密钥。 时间戳具有毫秒精度。
KSQL目前有以下要求从Kafka topic 创建table:
Kafka message key 也必须作为Kafka value中的字段/列出现。 必须定义KEY属性(见下文)以通知KSQL消息值中的哪个字段/列表示Key。 如果消息值中不存在message key,请按照key要求中的说明进行操作。
消息密钥必须是VARCHAR又称为STRING格式。 如果message key不是此格式,请按照key要求中的说明进行操作。
WITH支持的配置信息跟上面的stream相同:
例子:
CREATE TABLE users (usertimestamp BIGINT, user_id VARCHAR, gender VARCHAR, region_id VARCHAR) WITH (
KAFKA_TOPIC = 'my-users-topic',
KEY = 'user_id');
如果source topic中列的名称是KSQL中的保留字之一,则可以使用后引号来定义列。 这同样适用于STRUCT类型中的字段名称。 例如,如果在上面的示例中我们有另一个名为Properties的字段,它是KSQL中的保留字,可以使用以下语句来声明table:
CREATE TABLE users (usertimestamp BIGINT, user_id VARCHAR, gender VARCHAR, region_id VARCHAR, `Properties` VARCHAR) WITH (
KAFKA_TOPIC = 'my-users-topic',
KEY = 'user_id');
改变副本参数