KSQL是类SQL操作,要以 ";" 结尾,通过使用两个连续的单引号('')来转义字符串文字中的单引号字符(')。例如,要逃避'T',请写''T''。
Stream
stream是一个无序的数据结构。打个比方,我们可以进行一些列交易,Alice向Bob发送了100美元,然后Charlie向Bob发送了50美元。stream中发生的事件是不可改变的,已经被认定为事实,新的事件加入到这个stream中,现有的事实都不会改变。Streams可以从Kafka的topic创建出来,也可以从现有streams中派生出来。streams的基础数据在Kafka的broker里的topic持久保存(持久化)
Table
table是stream的一个视图,表示不断变化的事实的集合。打个比方,我们可以有一个表格,其中包含最新的财务信息,例如“Bob的当前账户余额为150美元”。 它相当于传统的数据库表,但通过流式语义(如窗口)进行了丰富。 table中的事实是可变的,这意味着可以将新事实插入表中,同时可以更新或删除现有事实。 可以从Kafka主题创建table,也可以从现有streams和tables中派生。 在这两种情况下,table的基础数据都在Kafka的broker里的topic中持久存储(持久化)。
STRUCT
在KSQL 5.0及更高版本中,我们可以使用CREATE STREAM和CREATE TABLE语句中的STRUCT类型以Avro和JSON格式读取嵌套数据。 我们可以在这些KSQL语句中使用STRUCT类型:
- CREATE STREAM/TABLE (from a topic)
- CREATE STREAM/TABLE AS SELECT (from existing streams/tables)
- SELECT (non-persistent query)
使用以下语法声明嵌套数据:
STRUCT<FieldName FieldType, ...>
STRUCT类型要求我们指定字段列表。 对于每个字段,可以指定字段名称和字段类型。 字段类型可以是任何受支持的KSQL类型,包括复杂类型MAP,ARRAY和STRUCT。
注意
Properties 不是有效的字段名
一个CREATE STREAM语句事例,它使用STRUCT来封装街道地址和邮政编码:
CREATE STREAM orders (
orderId BIGINT,
address STRUCT<street VARCHAR, zip INTEGER>) WITH (...);
使用引用运算符( - >)访问STRUCT中的字段:
使用解除引用运算符( - >)访问STRUCT中的字段:
KSQL在值表达式中支持以下运算符。
每个运算符的说明如下:
CREATE TABLE USERS (
USERID BIGINT
FIRST_NAME STRING,
LAST_NAME STRING,
NICKNAMES ARRAY<STRING>,
ADDRESS STRUCT<STREET_NAME STRING, NUMBER INTEGER>
) WITH (KAFKA_TOPIC='users', VALUE_FORMAT='AVRO', KEY='USERID');
(+, - ,/,*,%)通常的算术运算符可以应用于数值类型(INT,BIGINT,DOUBLE)
SELECT LEN(FIRST_NAME) + LEN(LAST_NAME) AS NAME_LENGTH FROM USERS;
(+,||)连接运算符可用于连接STRING值。
SELECT FIRST_NAME + LAST_NAME AS FULL_NAME FROM USERS;
可以使用+运算符进行多部分串联,例如:
SELECT TIMESTAMPTOSTRING(ROWTIME, 'yyyy-MM-dd HH:mm:ss') +
': :heavy_exclamation_mark: On ' +
HOST +
' there were ' +
CAST(INVALID_LOGIN_COUNT AS VARCHAR) +
' attempts in the last minute (threshold is >=4)'
FROM INVALID_USERS_LOGINS_PER_HOST
WHERE INVALID_LOGIN_COUNT>=4;
引用(.)可用于指定特定列
SELECT USERS.FIRST_NAME FROM USERS;
下标([subscript_expr])用于引用数组索引或映射键的值。
SELECT NICKNAMES[0] FROM USERS;
STRUCT引用( - >)通过声明STRUCT其字段来访问嵌套数据:
CREATE STREAM orders (
orderId BIGINT,
address STRUCT<street VARCHAR, zip INTEGER>) WITH (...);
SELECT address->street, address->zip FROM orders;
结合 - >。 使用别名:
SELECT orders.address->street, o.address->zip FROM orders o;
注意
不能创建新的嵌套STRUCT数据作为查询的结果,但您可以按原样复制现有的STRUCT字段。
KSQL Time Units
以下列表显示SIZE,ADVANCE BY,SESSION和WITHIN子句的有效时间单位。
- DAY, DAYS
- HOUR, HOURS
- MINUTE, MINUTES
- SECOND, SECONDS
- MILLISECOND, MILLISECONDS
详细了解, 请看 Windows in KSQL Queries.
KSQL Timestamp Formats(时间戳)
-- Example timestamp format: yyyy-MM-dd'T'HH:mm:ssX
CREATE STREAM TEST (ID bigint, event_timestamp VARCHAR)
WITH (kafka_topic='test_topic',
value_format='JSON',
timestamp='event_timestamp',
timestamp_format='yyyy-MM-dd''T''HH:mm:ssX');
-- Example timestamp format: yyyy.MM.dd G 'at' HH:mm:ss z
CREATE STREAM TEST (ID bigint, event_timestamp VARCHAR)
WITH (kafka_topic='test_topic',
value_format='JSON',
timestamp='event_timestamp',
timestamp_format='yyyy.MM.dd G ''at'' HH:mm:ss z');
-- Example timestamp format: hh 'o'clock' a, zzzz
CREATE STREAM TEST (ID bigint, event_timestamp VARCHAR)
WITH (kafka_topic='test_topic',
value_format='JSON',
timestamp='event_timestamp',
timestamp_format='hh ''o''clock'' a, zzzz');
了解更多相关信息,点我
KSQL CLI Commands
在启动ksql Server服务之后,通过命令 <path-to-confluent>/bin/ksql --help 可以查看相关的操作
ctrl - R可以清屏
NAME
ksql - KSQL CLI
SYNOPSIS
ksql [ --config-file <configFile> ] [ {-h | --help} ]
[ --output <outputFormat> ]
[ --query-row-limit <streamedQueryRowLimit> ]
[ --query-timeout <streamedQueryTimeoutMs> ] [--] <server>
OPTIONS
--config-file <configFile>
A file specifying configs for Ksql and its underlying Kafka Streams
instance(s). Refer to KSQL documentation for a list of available
configs.
-h, --help
Display help information
--output <outputFormat>
The output format to use (either 'JSON' or 'TABULAR'; can be changed
during REPL as well; defaults to TABULAR)
--query-row-limit <streamedQueryRowLimit>
An optional maximum number of rows to read from streamed queries
This options value must fall in the following range: value >= 1
--query-timeout <streamedQueryTimeoutMs>
An optional time limit (in milliseconds) for streamed queries
This options value must fall in the following range: value >= 1
--
This option can be used to separate command-line options from the
list of arguments (useful when arguments might be mistaken for
command-line options)
<server>
The address of the Ksql server to connect to (ex:
http://confluent.io:9098)
This option may occur a maximum of 1 times
RUN SCRIPT
可以将命令写在文件中执行
RUN SCRIPT '/local/path/to/queries.sql';
RUN SCRIPT支持的KSQL:
- Persistent queries: CREATE STREAM, CREATE TABLE, CREATE STREAM AS SELECT, CREATE TABLE AS SELECT
- DROP STREAM [IF EXISTS] [DELETE TOPIC]; and DROP TABLE [IF EXISTS] [DELETE TOPIC];
- SET, UNSET statements
- INSERT INTO statement
不支持:
- SHOW TOPICS and SHOW STREAMS etc
- TERMINATE
- Non-persistent queries: SELECT etc