From 6be04cb4fb67b3f3c52e946426430f9e2a754e9e Mon Sep 17 00:00:00 2001 From: Dave Troiano Date: Tue, 20 May 2025 09:45:10 -0400 Subject: [PATCH] chore: refactor filtering Flink SQL tutorial * jump right into instructions * CC instructions first * remove Table API-based test --- aggregating-count/ksql/README.md | 4 +- aggregating-minmax/ksql/README.md | 4 +- aggregating-sum/ksql/README.md | 4 +- anomaly-detection/ksql/README.md | 4 +- change-topic-partitions/ksql/README.md | 6 +- column-difference/ksql/README.md | 4 +- concatenation/ksql/README.md | 4 +- .../kafka/README.md | 2 +- convert-timestamp-timezone/ksql/README.md | 4 +- count-messages/ksql/README.md | 4 +- deduplication-windowed/ksql/README.md | 4 +- deserialization-errors/ksql/README.md | 6 +- filtering/flinksql/README.md | 131 ++++++------------ filtering/flinksql/build.gradle | 37 ----- filtering/flinksql/img/query-output.png | Bin 29480 -> 44832 bytes filtering/flinksql/settings.gradle | 12 -- .../developer/FlinkSqlFilteringTest.java | 42 ------ .../create-all-publications.sql.template | 16 --- .../resources/populate-publication-events.sql | 11 -- .../query-publications-by-author.sql | 5 - filtering/ksql/README.md | 4 +- flatten-nested-data/ksql/README.md | 4 +- geo-distance/ksql/README.md | 4 +- hopping-windows/ksql/README.md | 4 +- joining-stream-stream/ksql/README.md | 4 +- joining-stream-table/ksql/README.md | 4 +- joining-table-table/ksql/README.md | 4 +- ksql-heterogeneous-json/ksql/README.md | 6 +- masking-data/ksql/README.md | 4 +- merging/ksql/README.md | 4 +- multi-joins/ksql/README.md | 4 +- multiple-event-types-avro/kafka/README.md | 4 +- multiple-event-types-protobuf/kafka/README.md | 4 +- optimize-producer-throughput/kafka/README.md | 4 +- rekeying/ksql/README.md | 4 +- serialization/ksql/README.md | 4 +- session-windows/ksql/README.md | 4 +- splitting/ksql/README.md | 4 +- time-concepts/ksql/README.md | 4 +- transforming/ksql/README.md | 4 +- tumbling-windows/ksql/README.md | 4 +- 41 files changed, 109 insertions(+), 281 deletions(-) delete mode 100644 filtering/flinksql/build.gradle delete mode 100644 filtering/flinksql/settings.gradle delete mode 100644 filtering/flinksql/src/test/java/io/confluent/developer/FlinkSqlFilteringTest.java delete mode 100644 filtering/flinksql/src/test/resources/create-all-publications.sql.template delete mode 100644 filtering/flinksql/src/test/resources/populate-publication-events.sql delete mode 100644 filtering/flinksql/src/test/resources/query-publications-by-author.sql diff --git a/aggregating-count/ksql/README.md b/aggregating-count/ksql/README.md index 1779102d..4459ce13 100644 --- a/aggregating-count/ksql/README.md +++ b/aggregating-count/ksql/README.md @@ -165,9 +165,9 @@ You can run the example backing this tutorial in one of two ways: locally with t ### Run the commands - Login to the [Confluent Cloud Console](https://confluent.cloud/). Select `Environments` in the lefthand navigation, + Login to the [Confluent Cloud Console](https://confluent.cloud/). Select `Environments` in the left-hand navigation, and then click the `ksqldb-tutorial` environment tile. Click the `ksqldb-tutorial` Kafka cluster tile, and then - select `ksqlDB` in the lefthand navigation. + select `ksqlDB` in the left-hand navigation. The cluster may take a few minutes to be provisioned. Once its status is `Up`, click the cluster name and scroll down to the editor. diff --git a/aggregating-minmax/ksql/README.md b/aggregating-minmax/ksql/README.md index 500ad6e9..0c4417bf 100644 --- a/aggregating-minmax/ksql/README.md +++ b/aggregating-minmax/ksql/README.md @@ -166,9 +166,9 @@ You can run the example backing this tutorial in one of two ways: locally with t ### Run the commands - Login to the [Confluent Cloud Console](https://confluent.cloud/). Select `Environments` in the lefthand navigation, + Login to the [Confluent Cloud Console](https://confluent.cloud/). Select `Environments` in the left-hand navigation, and then click the `ksqldb-tutorial` environment tile. Click the `ksqldb-tutorial` Kafka cluster tile, and then - select `ksqlDB` in the lefthand navigation. + select `ksqlDB` in the left-hand navigation. The cluster may take a few minutes to be provisioned. Once its status is `Up`, click the cluster name and scroll down to the editor. diff --git a/aggregating-sum/ksql/README.md b/aggregating-sum/ksql/README.md index ea0d64e9..a516187b 100644 --- a/aggregating-sum/ksql/README.md +++ b/aggregating-sum/ksql/README.md @@ -165,9 +165,9 @@ You can run the example backing this tutorial in one of two ways: locally with t ### Run the commands - Login to the [Confluent Cloud Console](https://confluent.cloud/). Select `Environments` in the lefthand navigation, + Login to the [Confluent Cloud Console](https://confluent.cloud/). Select `Environments` in the left-hand navigation, and then click the `ksqldb-tutorial` environment tile. Click the `ksqldb-tutorial` Kafka cluster tile, and then - select `ksqlDB` in the lefthand navigation. + select `ksqlDB` in the left-hand navigation. The cluster may take a few minutes to be provisioned. Once its status is `Up`, click the cluster name and scroll down to the editor. diff --git a/anomaly-detection/ksql/README.md b/anomaly-detection/ksql/README.md index a1cce2d8..7edb2544 100644 --- a/anomaly-detection/ksql/README.md +++ b/anomaly-detection/ksql/README.md @@ -232,9 +232,9 @@ You can run the example backing this tutorial in one of two ways: locally with t ### Run the commands - Login to the [Confluent Cloud Console](https://confluent.cloud/). Select `Environments` in the lefthand navigation, + Login to the [Confluent Cloud Console](https://confluent.cloud/). Select `Environments` in the left-hand navigation, and then click the `ksqldb-tutorial` environment tile. Click the `ksqldb-tutorial` Kafka cluster tile, and then - select `ksqlDB` in the lefthand navigation. + select `ksqlDB` in the left-hand navigation. The cluster may take a few minutes to be provisioned. Once its status is `Up`, click the cluster name and scroll down to the editor. diff --git a/change-topic-partitions/ksql/README.md b/change-topic-partitions/ksql/README.md index 6ba78c25..acbb04d0 100644 --- a/change-topic-partitions/ksql/README.md +++ b/change-topic-partitions/ksql/README.md @@ -156,9 +156,9 @@ You can run the example backing this tutorial in one of two ways: locally with t ### Run the commands - Login to the [Confluent Cloud Console](https://confluent.cloud/). Select `Environments` in the lefthand navigation, + Login to the [Confluent Cloud Console](https://confluent.cloud/). Select `Environments` in the left-hand navigation, and then click the `ksqldb-tutorial` environment tile. Click the `ksqldb-tutorial` Kafka cluster tile, and then - select `ksqlDB` in the lefthand navigation. + select `ksqlDB` in the left-hand navigation. The cluster may take a few minutes to be provisioned. Once its status is `Up`, click the cluster name and scroll down to the editor. @@ -194,7 +194,7 @@ You can run the example backing this tutorial in one of two ways: locally with t ``` Observe the expected number of partitions for the `topic` and `topic2` topics when you navigate - to `Topics` in the lefthand navigation of the Confluent Cloud Console. + to `Topics` in the left-hand navigation of the Confluent Cloud Console. ### Clean up diff --git a/column-difference/ksql/README.md b/column-difference/ksql/README.md index bdf85c6d..0dadd6ef 100644 --- a/column-difference/ksql/README.md +++ b/column-difference/ksql/README.md @@ -177,9 +177,9 @@ You can run the example backing this tutorial in one of two ways: locally with t ### Run the commands - Login to the [Confluent Cloud Console](https://confluent.cloud/). Select `Environments` in the lefthand navigation, + Login to the [Confluent Cloud Console](https://confluent.cloud/). Select `Environments` in the left-hand navigation, and then click the `ksqldb-tutorial` environment tile. Click the `ksqldb-tutorial` Kafka cluster tile, and then - select `ksqlDB` in the lefthand navigation. + select `ksqlDB` in the left-hand navigation. The cluster may take a few minutes to be provisioned. Once its status is `Up`, click the cluster name and scroll down to the editor. diff --git a/concatenation/ksql/README.md b/concatenation/ksql/README.md index d3e41c58..7a1bd95f 100644 --- a/concatenation/ksql/README.md +++ b/concatenation/ksql/README.md @@ -186,9 +186,9 @@ You can run the example backing this tutorial in one of two ways: locally with t ### Run the commands - Login to the [Confluent Cloud Console](https://confluent.cloud/). Select `Environments` in the lefthand navigation, + Login to the [Confluent Cloud Console](https://confluent.cloud/). Select `Environments` in the left-hand navigation, and then click the `ksqldb-tutorial` environment tile. Click the `ksqldb-tutorial` Kafka cluster tile, and then - select `ksqlDB` in the lefthand navigation. + select `ksqlDB` in the left-hand navigation. The cluster may take a few minutes to be provisioned. Once its status is `Up`, click the cluster name and scroll down to the editor. diff --git a/confluent-cloud-connector-aws-privatelink/kafka/README.md b/confluent-cloud-connector-aws-privatelink/kafka/README.md index e43b730a..c881c80f 100644 --- a/confluent-cloud-connector-aws-privatelink/kafka/README.md +++ b/confluent-cloud-connector-aws-privatelink/kafka/README.md @@ -57,7 +57,7 @@ confluent api-key create --resource ```noformat confluent connect cluster create --config-file /tmp/datagen-connector.json ``` -* After a minute or so, validate in the Confluent Cloud Console that the connector is running. In the lefhand navigation, select `Environments`, click into the environment, then click the PrivateLink cluster. In the lefthand navigation, select `Connectors` and verify that the connector state is `Running` and generating messages: +* After a minute or so, validate in the Confluent Cloud Console that the connector is running. In the lefhand navigation, select `Environments`, click into the environment, then click the PrivateLink cluster. In the left-hand navigation, select `Connectors` and verify that the connector state is `Running` and generating messages: ![Datagen](https://raw.githubusercontent.com/confluentinc/tutorials/master/confluent-cloud-connector-aws-privatelink/kafka/img/cc-datagen.png) diff --git a/convert-timestamp-timezone/ksql/README.md b/convert-timestamp-timezone/ksql/README.md index 71e7554f..357f1296 100644 --- a/convert-timestamp-timezone/ksql/README.md +++ b/convert-timestamp-timezone/ksql/README.md @@ -161,9 +161,9 @@ You can run the example backing this tutorial in one of two ways: locally with t ### Run the commands - Login to the [Confluent Cloud Console](https://confluent.cloud/). Select `Environments` in the lefthand navigation, + Login to the [Confluent Cloud Console](https://confluent.cloud/). Select `Environments` in the left-hand navigation, and then click the `ksqldb-tutorial` environment tile. Click the `ksqldb-tutorial` Kafka cluster tile, and then - select `ksqlDB` in the lefthand navigation. + select `ksqlDB` in the left-hand navigation. The cluster may take a few minutes to be provisioned. Once its status is `Up`, click the cluster name and scroll down to the editor. diff --git a/count-messages/ksql/README.md b/count-messages/ksql/README.md index 18d54da2..bcd4ba20 100644 --- a/count-messages/ksql/README.md +++ b/count-messages/ksql/README.md @@ -160,9 +160,9 @@ You can run the example backing this tutorial in one of two ways: locally with t ### Run the commands - Login to the [Confluent Cloud Console](https://confluent.cloud/). Select `Environments` in the lefthand navigation, + Login to the [Confluent Cloud Console](https://confluent.cloud/). Select `Environments` in the left-hand navigation, and then click the `ksqldb-tutorial` environment tile. Click the `ksqldb-tutorial` Kafka cluster tile, and then - select `ksqlDB` in the lefthand navigation. + select `ksqlDB` in the left-hand navigation. The cluster may take a few minutes to be provisioned. Once its status is `Up`, click the cluster name and scroll down to the editor. diff --git a/deduplication-windowed/ksql/README.md b/deduplication-windowed/ksql/README.md index f50a636b..8978786b 100644 --- a/deduplication-windowed/ksql/README.md +++ b/deduplication-windowed/ksql/README.md @@ -219,9 +219,9 @@ You can run the example backing this tutorial in one of two ways: locally with t ### Run the commands - Login to the [Confluent Cloud Console](https://confluent.cloud/). Select `Environments` in the lefthand navigation, + Login to the [Confluent Cloud Console](https://confluent.cloud/). Select `Environments` in the left-hand navigation, and then click the `ksqldb-tutorial` environment tile. Click the `ksqldb-tutorial` Kafka cluster tile, and then - select `ksqlDB` in the lefthand navigation. + select `ksqlDB` in the left-hand navigation. The cluster may take a few minutes to be provisioned. Once its status is `Up`, click the cluster name and scroll down to the editor. diff --git a/deserialization-errors/ksql/README.md b/deserialization-errors/ksql/README.md index e5093c7b..72c7af61 100644 --- a/deserialization-errors/ksql/README.md +++ b/deserialization-errors/ksql/README.md @@ -69,9 +69,9 @@ confluent ksql cluster create ksqldb-tutorial \ ### Run the commands -Login to the [Confluent Cloud Console](https://confluent.cloud/). Select `Environments` in the lefthand navigation, +Login to the [Confluent Cloud Console](https://confluent.cloud/). Select `Environments` in the left-hand navigation, and then click the `ksqldb-tutorial` environment tile. Click the `ksqldb-tutorial` Kafka cluster tile, and then select -`Topics` in the lefthand navigation. Create a topic called `sensors-raw` with 1 partition, and in the `Messages` tab, +`Topics` in the left-hand navigation. Create a topic called `sensors-raw` with 1 partition, and in the `Messages` tab, produce the following two events, one at a time. ```noformat @@ -82,7 +82,7 @@ produce the following two events, one at a time. {"id": "1a076a64-4a84-40cb-a2e8-2190f3b37465", "timestamp": "2020-01-15 02:30:30", "enabled": "true"} ``` -Next, select `ksqlDB` in the lefthand navigation. +Next, select `ksqlDB` in the left-hand navigation. The cluster may take a few minutes to be provisioned. Once its status is `Up`, click the cluster name and scroll down to the editor. diff --git a/filtering/flinksql/README.md b/filtering/flinksql/README.md index 3884f612..a8608520 100644 --- a/filtering/flinksql/README.md +++ b/filtering/flinksql/README.md @@ -3,24 +3,50 @@ # How to filter messages in a Kafka topic with Flink SQL -Consider a topic with events that represent book publications. In this tutorial, we'll use Flink SQL to find only the -publications written by a particular author. +### Overview -## Setup +In this tutorial, we'll use Flink SQL to filter messages in a Kafka topic. -Let's assume the following DDL for our base `publication_events` table: +### Prerequisites + +* A [Confluent Cloud](https://confluent.cloud/signup) account +* A Flink compute pool created in Confluent Cloud. Follow [this](https://docs.confluent.io/cloud/current/flink/get-started/quick-start-cloud-console.html) quick start to create one. + +### Tutorial steps + +The following steps use Confluent Cloud. See the section at the bottom to run it locally with Docker. + +In the [Confluent Cloud Console](https://confluent.cloud/), navigate to your environment and select `Flink` in the left-hand navigation. Then click the `Open SQL Workspace` button for the compute pool that you have created. + +Select the default catalog (Confluent Cloud environment) and database (Kafka cluster) to use with the dropdowns at the top right. + +Run following SQL statement to create a table named `publication_events` that represents book publications: ```sql CREATE TABLE publication_events ( book_id INT, author STRING, - title STRING + title STRING ); ``` -## Filter events +Populate the table with test data: -Given the `publication_events` table definition above, we can filter to the publications by a particular author using a `WHERE` clause: +```sql +INSERT INTO publication_events VALUES + (0, 'C.S. Lewis', 'The Silver Chair'), + (1, 'George R. R. Martin', 'A Song of Ice and Fire'), + (2, 'C.S. Lewis', 'Perelandra'), + (3, 'George R. R. Martin', 'Fire & Blood'), + (4, 'J. R. R. Tolkien', 'The Hobbit'), + (5, 'J. R. R. Tolkien', 'The Lord of the Rings'), + (6, 'George R. R. Martin', 'A Dream of Spring'), + (7, 'J. R. R. Tolkien', 'The Fellowship of the Ring'), + (8, 'George R. R. Martin', 'The Ice Dragon'), + (9, 'Mario Puzo', 'The Godfather'); +``` + +Use the [`WHERE` clause](https://docs.confluent.io/cloud/current/flink/reference/queries/select.html#where-clause) to filter the rows down to the publications written by George R. R. Martin: ```sql SELECT * @@ -28,40 +54,13 @@ FROM publication_events WHERE author = 'George R. R. Martin'; ``` -## Running the example +The query output should look like this: -You can run the example backing this tutorial in one of three ways: a Flink Table API-based JUnit test, locally with the Flink SQL Client -against Flink and Kafka running in Docker, or with Confluent Cloud. +![Query output](https://raw.githubusercontent.com/confluentinc/tutorials/master/filtering/flinksql/img/query-output.png) -
- Flink Table API-based test - - ### Prerequisites - - * Java 17, e.g., follow the OpenJDK installation instructions [here](https://openjdk.org/install/) if you don't have Java. - * Docker running via [Docker Desktop](https://docs.docker.com/desktop/) or [Docker Engine](https://docs.docker.com/engine/install/) - - ### Run the test - - Clone the `confluentinc/tutorials` GitHub repository (if you haven't already) and navigate to the `tutorials` directory: - - ```shell - git clone git@github.com:confluentinc/tutorials.git - cd tutorials - ``` - - Run the following command to execute [FlinkSqlFilteringTest#testFilter](https://github.com/confluentinc/tutorials/blob/master/filtering/flinksql/src/test/java/io/confluent/developer/FlinkSqlFilteringTest.java): - - ```plaintext - ./gradlew clean :filtering:flinksql:test - ``` - - The test starts Kafka and Schema Registry with [Testcontainers](https://testcontainers.com/), runs the Flink SQL commands - above against a local Flink `StreamExecutionEnvironment`, and ensures that the filter results are what we expect. -
- Flink SQL Client CLI + Docker instructions ### Prerequisites @@ -89,8 +88,7 @@ against Flink and Kafka running in Docker, or with Confluent Cloud. docker exec -it flink-sql-client sql-client.sh ``` - Finally, run following SQL statements to create the `publication_events` table backed by Kafka running in Docker, populate it with - test data, and run the filter query. + Run following SQL statement to create a table named `publication_events` that represents book publications: ```sql CREATE TABLE publication_events ( @@ -110,6 +108,8 @@ against Flink and Kafka running in Docker, or with Confluent Cloud. ); ``` + Populate the table with test data: + ```sql INSERT INTO publication_events VALUES (0, 'C.S. Lewis', 'The Silver Chair'), @@ -124,6 +124,8 @@ against Flink and Kafka running in Docker, or with Confluent Cloud. (9, 'Mario Puzo', 'The Godfather'); ``` + Use the [`WHERE` clause](https://docs.confluent.io/cloud/current/flink/reference/queries/select.html#where-clause) to filter the rows down to the publications written by George R. R. Martin: + ```sql SELECT * FROM publication_events @@ -147,54 +149,3 @@ against Flink and Kafka running in Docker, or with Confluent Cloud. ```
- -
- Confluent Cloud - - ### Prerequisites - - * A [Confluent Cloud](https://confluent.cloud/signup) account - * A Flink compute pool created in Confluent Cloud. Follow [this](https://docs.confluent.io/cloud/current/flink/get-started/quick-start-cloud-console.html) quick start to create one. - - ### Run the commands - - In the Confluent Cloud Console, navigate to your environment and then click the `Open SQL Workspace` button for the compute - pool that you have created. - - Select the default catalog (Confluent Cloud environment) and database (Kafka cluster) to use with the dropdowns at the top right. - - Finally, run following SQL statements to create the `publication_events` table, populate it with test data, and run the filter query. - - ```sql - CREATE TABLE publication_events ( - book_id INT, - author STRING, - title STRING - ); - ``` - - ```sql - INSERT INTO publication_events VALUES - (0, 'C.S. Lewis', 'The Silver Chair'), - (1, 'George R. R. Martin', 'A Song of Ice and Fire'), - (2, 'C.S. Lewis', 'Perelandra'), - (3, 'George R. R. Martin', 'Fire & Blood'), - (4, 'J. R. R. Tolkien', 'The Hobbit'), - (5, 'J. R. R. Tolkien', 'The Lord of the Rings'), - (6, 'George R. R. Martin', 'A Dream of Spring'), - (7, 'J. R. R. Tolkien', 'The Fellowship of the Ring'), - (8, 'George R. R. Martin', 'The Ice Dragon'), - (9, 'Mario Puzo', 'The Godfather'); - ``` - - ```sql - SELECT * - FROM publication_events - WHERE author = 'George R. R. Martin'; - ``` - - The query output should look like this: - - ![Query output](https://raw.githubusercontent.com/confluentinc/tutorials/master/filtering/flinksql/img/query-output.png) - -
diff --git a/filtering/flinksql/build.gradle b/filtering/flinksql/build.gradle deleted file mode 100644 index b2b95b81..00000000 --- a/filtering/flinksql/build.gradle +++ /dev/null @@ -1,37 +0,0 @@ -buildscript { - repositories { - mavenCentral() - } -} - -plugins { - id 'java' - id 'idea' -} - -java { - sourceCompatibility = JavaVersion.VERSION_17 - targetCompatibility = JavaVersion.VERSION_17 -} -version = "0.0.1" - -repositories { - mavenCentral() -} - -dependencies { - testImplementation project(path: ':common', configuration: 'testArtifacts') - testImplementation 'com.google.guava:guava:31.1-jre' - testImplementation 'junit:junit:4.13.2' - testImplementation 'org.testcontainers:testcontainers:1.19.3' - testImplementation 'org.testcontainers:kafka:1.19.3' - testImplementation 'commons-codec:commons-codec:1.17.0' - testImplementation 'org.apache.flink:flink-sql-connector-kafka:3.2.0-1.19' - testImplementation 'org.apache.flink:flink-connector-base:1.19.1' - testImplementation 'org.apache.flink:flink-sql-avro-confluent-registry:1.19.1' - testImplementation 'org.apache.flink:flink-test-utils:1.19.1' - testImplementation 'org.apache.flink:flink-test-utils-junit:1.19.1' - testImplementation 'org.apache.flink:flink-table-api-java-bridge:1.19.1' - testImplementation 'org.apache.flink:flink-table-planner_2.12:1.19.1' - testImplementation 'org.apache.flink:flink-table-planner_2.12:1.19.1:tests' -} diff --git a/filtering/flinksql/img/query-output.png b/filtering/flinksql/img/query-output.png index 0b75e0844f3651daa5014aa7bb1d2b79910330fb..2cee980b3ad3c986cea3692008bdf01cf1305530 100644 GIT binary patch literal 44832 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 z actualResults = rowObjectsFromTableResult(tableResult); - List expectedRowResults = getExpectedFinalUpdateRowObjects(); - assertEquals(actualResults, expectedRowResults); - } - - private List getExpectedFinalUpdateRowObjects() { - List rowList = new ArrayList<>(); - rowList.add(Row.ofKind(RowKind.INSERT, 1, "A Song of Ice and Fire")); - rowList.add(Row.ofKind(RowKind.INSERT, 3, "Fire & Blood")); - rowList.add(Row.ofKind(RowKind.INSERT, 6, "A Dream of Spring")); - rowList.add(Row.ofKind(RowKind.INSERT, 8, "The Ice Dragon")); - return rowList; - } -} diff --git a/filtering/flinksql/src/test/resources/create-all-publications.sql.template b/filtering/flinksql/src/test/resources/create-all-publications.sql.template deleted file mode 100644 index 7cff5ef3..00000000 --- a/filtering/flinksql/src/test/resources/create-all-publications.sql.template +++ /dev/null @@ -1,16 +0,0 @@ -CREATE TABLE publication_events ( - book_id INT, - author STRING, - title STRING -) WITH ( - 'connector' = 'kafka', - 'topic' = 'publication_events', - 'properties.bootstrap.servers' = 'localhost:KAFKA_PORT', - 'scan.startup.mode' = 'earliest-offset', - 'scan.bounded.mode' = 'latest-offset', - 'key.format' = 'raw', - 'key.fields' = 'book_id', - 'value.format' = 'avro-confluent', - 'value.avro-confluent.url' = 'http://localhost:SCHEMA_REGISTRY_PORT', - 'value.fields-include' = 'EXCEPT_KEY' -); diff --git a/filtering/flinksql/src/test/resources/populate-publication-events.sql b/filtering/flinksql/src/test/resources/populate-publication-events.sql deleted file mode 100644 index 9060fda0..00000000 --- a/filtering/flinksql/src/test/resources/populate-publication-events.sql +++ /dev/null @@ -1,11 +0,0 @@ -INSERT INTO publication_events VALUES - (0, 'C.S. Lewis', 'The Silver Chair'), - (1, 'George R. R. Martin', 'A Song of Ice and Fire'), - (2, 'C.S. Lewis', 'Perelandra'), - (3, 'George R. R. Martin', 'Fire & Blood'), - (4, 'J. R. R. Tolkien', 'The Hobbit'), - (5, 'J. R. R. Tolkien', 'The Lord of the Rings'), - (6, 'George R. R. Martin', 'A Dream of Spring'), - (7, 'J. R. R. Tolkien', 'The Fellowship of the Ring'), - (8, 'George R. R. Martin', 'The Ice Dragon'), - (9, 'Mario Puzo', 'The Godfather'); diff --git a/filtering/flinksql/src/test/resources/query-publications-by-author.sql b/filtering/flinksql/src/test/resources/query-publications-by-author.sql deleted file mode 100644 index 4c504d46..00000000 --- a/filtering/flinksql/src/test/resources/query-publications-by-author.sql +++ /dev/null @@ -1,5 +0,0 @@ -SELECT - book_id, - title -FROM publication_events -WHERE author = 'George R. R. Martin'; diff --git a/filtering/ksql/README.md b/filtering/ksql/README.md index cfbed552..8e5617de 100644 --- a/filtering/ksql/README.md +++ b/filtering/ksql/README.md @@ -175,9 +175,9 @@ You can run the example backing this tutorial in one of two ways: locally with t ### Run the commands - Login to the [Confluent Cloud Console](https://confluent.cloud/). Select `Environments` in the lefthand navigation, + Login to the [Confluent Cloud Console](https://confluent.cloud/). Select `Environments` in the left-hand navigation, and then click the `ksqldb-tutorial` environment tile. Click the `ksqldb-tutorial` Kafka cluster tile, and then - select `ksqlDB` in the lefthand navigation. + select `ksqlDB` in the left-hand navigation. The cluster may take a few minutes to be provisioned. Once its status is `Up`, click the cluster name and scroll down to the editor. diff --git a/flatten-nested-data/ksql/README.md b/flatten-nested-data/ksql/README.md index c4f4b7ec..2f5078b6 100644 --- a/flatten-nested-data/ksql/README.md +++ b/flatten-nested-data/ksql/README.md @@ -298,9 +298,9 @@ You can run the example backing this tutorial in one of two ways: locally with t ### Run the commands - Login to the [Confluent Cloud Console](https://confluent.cloud/). Select `Environments` in the lefthand navigation, + Login to the [Confluent Cloud Console](https://confluent.cloud/). Select `Environments` in the left-hand navigation, and then click the `ksqldb-tutorial` environment tile. Click the `ksqldb-tutorial` Kafka cluster tile, and then - select `ksqlDB` in the lefthand navigation. + select `ksqlDB` in the left-hand navigation. The cluster may take a few minutes to be provisioned. Once its status is `Up`, click the cluster name and scroll down to the editor. diff --git a/geo-distance/ksql/README.md b/geo-distance/ksql/README.md index 814c5822..9ff4346f 100644 --- a/geo-distance/ksql/README.md +++ b/geo-distance/ksql/README.md @@ -203,9 +203,9 @@ You can run the example backing this tutorial in one of two ways: locally with t ### Run the commands - Login to the [Confluent Cloud Console](https://confluent.cloud/). Select `Environments` in the lefthand navigation, + Login to the [Confluent Cloud Console](https://confluent.cloud/). Select `Environments` in the left-hand navigation, and then click the `ksqldb-tutorial` environment tile. Click the `ksqldb-tutorial` Kafka cluster tile, and then - select `ksqlDB` in the lefthand navigation. + select `ksqlDB` in the left-hand navigation. The cluster may take a few minutes to be provisioned. Once its status is `Up`, click the cluster name and scroll down to the editor. diff --git a/hopping-windows/ksql/README.md b/hopping-windows/ksql/README.md index db64ed57..5d968195 100644 --- a/hopping-windows/ksql/README.md +++ b/hopping-windows/ksql/README.md @@ -193,9 +193,9 @@ You can run the example backing this tutorial in one of two ways: locally with t ### Run the commands - Login to the [Confluent Cloud Console](https://confluent.cloud/). Select `Environments` in the lefthand navigation, + Login to the [Confluent Cloud Console](https://confluent.cloud/). Select `Environments` in the left-hand navigation, and then click the `ksqldb-tutorial` environment tile. Click the `ksqldb-tutorial` Kafka cluster tile, and then - select `ksqlDB` in the lefthand navigation. + select `ksqlDB` in the left-hand navigation. The cluster may take a few minutes to be provisioned. Once its status is `Up`, click the cluster name and scroll down to the editor. diff --git a/joining-stream-stream/ksql/README.md b/joining-stream-stream/ksql/README.md index 1d519ecb..93535d17 100644 --- a/joining-stream-stream/ksql/README.md +++ b/joining-stream-stream/ksql/README.md @@ -215,9 +215,9 @@ You can run the example backing this tutorial in one of two ways: locally with t ### Run the commands - Login to the [Confluent Cloud Console](https://confluent.cloud/). Select `Environments` in the lefthand navigation, + Login to the [Confluent Cloud Console](https://confluent.cloud/). Select `Environments` in the left-hand navigation, and then click the `ksqldb-tutorial` environment tile. Click the `ksqldb-tutorial` Kafka cluster tile, and then - select `ksqlDB` in the lefthand navigation. + select `ksqlDB` in the left-hand navigation. The cluster may take a few minutes to be provisioned. Once its status is `Up`, click the cluster name and scroll down to the editor. diff --git a/joining-stream-table/ksql/README.md b/joining-stream-table/ksql/README.md index 2fdf3516..4c1984d2 100644 --- a/joining-stream-table/ksql/README.md +++ b/joining-stream-table/ksql/README.md @@ -198,9 +198,9 @@ You can run the example backing this tutorial in one of two ways: locally with t ### Run the commands - Login to the [Confluent Cloud Console](https://confluent.cloud/). Select `Environments` in the lefthand navigation, + Login to the [Confluent Cloud Console](https://confluent.cloud/). Select `Environments` in the left-hand navigation, and then click the `ksqldb-tutorial` environment tile. Click the `ksqldb-tutorial` Kafka cluster tile, and then - select `ksqlDB` in the lefthand navigation. + select `ksqlDB` in the left-hand navigation. The cluster may take a few minutes to be provisioned. Once its status is `Up`, click the cluster name and scroll down to the editor. diff --git a/joining-table-table/ksql/README.md b/joining-table-table/ksql/README.md index 65125614..f556572b 100644 --- a/joining-table-table/ksql/README.md +++ b/joining-table-table/ksql/README.md @@ -202,9 +202,9 @@ You can run the example backing this tutorial in one of two ways: locally with t ### Run the commands - Login to the [Confluent Cloud Console](https://confluent.cloud/). Select `Environments` in the lefthand navigation, + Login to the [Confluent Cloud Console](https://confluent.cloud/). Select `Environments` in the left-hand navigation, and then click the `ksqldb-tutorial` environment tile. Click the `ksqldb-tutorial` Kafka cluster tile, and then - select `ksqlDB` in the lefthand navigation. + select `ksqlDB` in the left-hand navigation. The cluster may take a few minutes to be provisioned. Once its status is `Up`, click the cluster name and scroll down to the editor. diff --git a/ksql-heterogeneous-json/ksql/README.md b/ksql-heterogeneous-json/ksql/README.md index 2a74e91a..4da062d6 100644 --- a/ksql-heterogeneous-json/ksql/README.md +++ b/ksql-heterogeneous-json/ksql/README.md @@ -205,9 +205,9 @@ You can run the example backing this tutorial in one of two ways: locally with t ### Run the commands - Login to the [Confluent Cloud Console](https://confluent.cloud/). Select `Environments` in the lefthand navigation, + Login to the [Confluent Cloud Console](https://confluent.cloud/). Select `Environments` in the left-hand navigation, and then click the `ksqldb-tutorial` environment tile. Click the `ksqldb-tutorial` Kafka cluster tile, and then select - `Topics` in the lefthand navigation. Create a topic called `data_stream` with 1 partition, and in the `Messages` tab, + `Topics` in the left-hand navigation. Create a topic called `data_stream` with 1 partition, and in the `Messages` tab, produce the following four events as the `Value`, one at a time. ```noformat @@ -302,7 +302,7 @@ You can run the example backing this tutorial in one of two ways: locally with t } ``` - Next, select `ksqlDB` in the lefthand navigation. + Next, select `ksqlDB` in the left-hand navigation. The cluster may take a few minutes to be provisioned. Once its status is `Up`, click the cluster name and scroll down to the editor. diff --git a/masking-data/ksql/README.md b/masking-data/ksql/README.md index 6329d260..13151b5c 100644 --- a/masking-data/ksql/README.md +++ b/masking-data/ksql/README.md @@ -172,9 +172,9 @@ You can run the example backing this tutorial in one of two ways: locally with t ### Run the commands - Login to the [Confluent Cloud Console](https://confluent.cloud/). Select `Environments` in the lefthand navigation, + Login to the [Confluent Cloud Console](https://confluent.cloud/). Select `Environments` in the left-hand navigation, and then click the `ksqldb-tutorial` environment tile. Click the `ksqldb-tutorial` Kafka cluster tile, and then - select `ksqlDB` in the lefthand navigation. + select `ksqlDB` in the left-hand navigation. The cluster may take a few minutes to be provisioned. Once its status is `Up`, click the cluster name and scroll down to the editor. diff --git a/merging/ksql/README.md b/merging/ksql/README.md index fe6773e4..a0ee0650 100644 --- a/merging/ksql/README.md +++ b/merging/ksql/README.md @@ -190,9 +190,9 @@ You can run the example backing this tutorial in one of two ways: locally with t ### Run the commands - Login to the [Confluent Cloud Console](https://confluent.cloud/). Select `Environments` in the lefthand navigation, + Login to the [Confluent Cloud Console](https://confluent.cloud/). Select `Environments` in the left-hand navigation, and then click the `ksqldb-tutorial` environment tile. Click the `ksqldb-tutorial` Kafka cluster tile, and then - select `ksqlDB` in the lefthand navigation. + select `ksqlDB` in the left-hand navigation. The cluster may take a few minutes to be provisioned. Once its status is `Up`, click the cluster name and scroll down to the editor. diff --git a/multi-joins/ksql/README.md b/multi-joins/ksql/README.md index b1c7da3c..1c5981b5 100644 --- a/multi-joins/ksql/README.md +++ b/multi-joins/ksql/README.md @@ -212,9 +212,9 @@ You can run the example backing this tutorial in one of two ways: locally with t ### Run the commands - Login to the [Confluent Cloud Console](https://confluent.cloud/). Select `Environments` in the lefthand navigation, + Login to the [Confluent Cloud Console](https://confluent.cloud/). Select `Environments` in the left-hand navigation, and then click the `ksqldb-tutorial` environment tile. Click the `ksqldb-tutorial` Kafka cluster tile, and then - select `ksqlDB` in the lefthand navigation. + select `ksqlDB` in the left-hand navigation. The cluster may take a few minutes to be provisioned. Once its status is `Up`, click the cluster name and scroll down to the editor. diff --git a/multiple-event-types-avro/kafka/README.md b/multiple-event-types-avro/kafka/README.md index aa55b1d5..c241447f 100644 --- a/multiple-event-types-avro/kafka/README.md +++ b/multiple-event-types-avro/kafka/README.md @@ -146,7 +146,7 @@ Using the Confluent Cloud Console, create a topic with default settings called ` ### Generate client configuration -In the Confluent Cloud Console, navigate to the Cluster Overview page. Select `Clients` in the lefthand navigation and create a new `Java` client. Generate API keys during this step, and download the generated client configuration. Place it at `multiple-event-types-avro/kafka/cloud.properties`. +In the Confluent Cloud Console, navigate to the Cluster Overview page. Select `Clients` in the left-hand navigation and create a new `Java` client. Generate API keys during this step, and download the generated client configuration. Place it at `multiple-event-types-avro/kafka/cloud.properties`. ### Register schemas @@ -156,7 +156,7 @@ Run the following task to register the schemas in Schema Registry: ./gradlew :multiple-event-types-avro:kafka:registerSchemasTask ``` -In the Confluent Cloud Console, navigate to `Topics` in the lefthand navigation, select the `avro-events` topic, and click `Schema`. Validate that a `Value` schema has been set. +In the Confluent Cloud Console, navigate to `Topics` in the left-hand navigation, select the `avro-events` topic, and click `Schema`. Validate that a `Value` schema has been set. ### Build the application diff --git a/multiple-event-types-protobuf/kafka/README.md b/multiple-event-types-protobuf/kafka/README.md index bd6663c8..c7361823 100644 --- a/multiple-event-types-protobuf/kafka/README.md +++ b/multiple-event-types-protobuf/kafka/README.md @@ -131,7 +131,7 @@ Using the Confluent Cloud Console, create a topic with default settings called ` ### Generate client configuration -In the Confluent Cloud Console, navigate to the Cluster Overview page. Select `Clients` in the lefthand navigation and create a new `Java` client. Generate API keys during this step, and download the generated client configuration. Place it at `multiple-event-types-protobuf/kafka/cloud.properties`. +In the Confluent Cloud Console, navigate to the Cluster Overview page. Select `Clients` in the left-hand navigation and create a new `Java` client. Generate API keys during this step, and download the generated client configuration. Place it at `multiple-event-types-protobuf/kafka/cloud.properties`. ### Register schemas @@ -141,7 +141,7 @@ Run the following task to register the schemas in Schema Registry: ./gradlew :multiple-event-types-protobuf:kafka:registerSchemasTask ``` -In the Confluent Cloud Console, navigate to `Topics` in the lefthand navigation, select the `proto-events` topic, and click `Schema`. Validate that a `Value` schema has been set. +In the Confluent Cloud Console, navigate to `Topics` in the left-hand navigation, select the `proto-events` topic, and click `Schema`. Validate that a `Value` schema has been set. ### Build the application diff --git a/optimize-producer-throughput/kafka/README.md b/optimize-producer-throughput/kafka/README.md index eabe9e0d..1b753134 100644 --- a/optimize-producer-throughput/kafka/README.md +++ b/optimize-producer-throughput/kafka/README.md @@ -96,9 +96,9 @@ Now run the same test but with producer configuration tuned for higher throughpu First, create a cluster if you haven't already. You can do this in the Confluent Cloud Console by navigating to your environment and then clicking `Add cluster`. -Once you have a cluster running, navigate to `Topics` in the lefthand navigation and create a topic `topic-perf` with the default topic configuration. +Once you have a cluster running, navigate to `Topics` in the left-hand navigation and create a topic `topic-perf` with the default topic configuration. -Next, go to the Cluster Overview page and click `Clients` in the lefthand navigation. Click `Java` and generate a configuration file that includes API keys. +Next, go to the Cluster Overview page and click `Clients` in the left-hand navigation. Click `Java` and generate a configuration file that includes API keys. pool that you have created. Copy the configuration file locally to `optimize-producer-throughput/kafka/cloud.properties`. Now, run a baseline performance test with Docker: diff --git a/rekeying/ksql/README.md b/rekeying/ksql/README.md index 5293c3e7..ddd898ba 100644 --- a/rekeying/ksql/README.md +++ b/rekeying/ksql/README.md @@ -183,9 +183,9 @@ You can run the example backing this tutorial in one of two ways: locally with t ### Run the commands - Login to the [Confluent Cloud Console](https://confluent.cloud/). Select `Environments` in the lefthand navigation, + Login to the [Confluent Cloud Console](https://confluent.cloud/). Select `Environments` in the left-hand navigation, and then click the `ksqldb-tutorial` environment tile. Click the `ksqldb-tutorial` Kafka cluster tile, and then - select `ksqlDB` in the lefthand navigation. + select `ksqlDB` in the left-hand navigation. The cluster may take a few minutes to be provisioned. Once its status is `Up`, click the cluster name and scroll down to the editor. diff --git a/serialization/ksql/README.md b/serialization/ksql/README.md index 43175853..6af0e965 100644 --- a/serialization/ksql/README.md +++ b/serialization/ksql/README.md @@ -145,9 +145,9 @@ You can run the example backing this tutorial in one of two ways: locally with t ### Run the commands - Login to the [Confluent Cloud Console](https://confluent.cloud/). Select `Environments` in the lefthand navigation, + Login to the [Confluent Cloud Console](https://confluent.cloud/). Select `Environments` in the left-hand navigation, and then click the `ksqldb-tutorial` environment tile. Click the `ksqldb-tutorial` Kafka cluster tile, and then - select `ksqlDB` in the lefthand navigation. + select `ksqlDB` in the left-hand navigation. The cluster may take a few minutes to be provisioned. Once its status is `Up`, click the cluster name and scroll down to the editor. diff --git a/session-windows/ksql/README.md b/session-windows/ksql/README.md index d52adc85..005d04c4 100644 --- a/session-windows/ksql/README.md +++ b/session-windows/ksql/README.md @@ -182,9 +182,9 @@ You can run the example backing this tutorial in one of two ways: locally with t ### Run the commands - Login to the [Confluent Cloud Console](https://confluent.cloud/). Select `Environments` in the lefthand navigation, + Login to the [Confluent Cloud Console](https://confluent.cloud/). Select `Environments` in the left-hand navigation, and then click the `ksqldb-tutorial` environment tile. Click the `ksqldb-tutorial` Kafka cluster tile, and then - select `ksqlDB` in the lefthand navigation. + select `ksqlDB` in the left-hand navigation. The cluster may take a few minutes to be provisioned. Once its status is `Up`, click the cluster name and scroll down to the editor. diff --git a/splitting/ksql/README.md b/splitting/ksql/README.md index dc698755..c926d937 100644 --- a/splitting/ksql/README.md +++ b/splitting/ksql/README.md @@ -183,9 +183,9 @@ You can run the example backing this tutorial in one of two ways: locally with t ### Run the commands - Login to the [Confluent Cloud Console](https://confluent.cloud/). Select `Environments` in the lefthand navigation, + Login to the [Confluent Cloud Console](https://confluent.cloud/). Select `Environments` in the left-hand navigation, and then click the `ksqldb-tutorial` environment tile. Click the `ksqldb-tutorial` Kafka cluster tile, and then - select `ksqlDB` in the lefthand navigation. + select `ksqlDB` in the left-hand navigation. The cluster may take a few minutes to be provisioned. Once its status is `Up`, click the cluster name and scroll down to the editor. diff --git a/time-concepts/ksql/README.md b/time-concepts/ksql/README.md index b358ebb5..63321ac5 100644 --- a/time-concepts/ksql/README.md +++ b/time-concepts/ksql/README.md @@ -168,9 +168,9 @@ You can run the example backing this tutorial in one of two ways: locally with t ### Run the commands - Login to the [Confluent Cloud Console](https://confluent.cloud/). Select `Environments` in the lefthand navigation, + Login to the [Confluent Cloud Console](https://confluent.cloud/). Select `Environments` in the left-hand navigation, and then click the `ksqldb-tutorial` environment tile. Click the `ksqldb-tutorial` Kafka cluster tile, and then - select `ksqlDB` in the lefthand navigation. + select `ksqlDB` in the left-hand navigation. The cluster may take a few minutes to be provisioned. Once its status is `Up`, click the cluster name and scroll down to the editor. diff --git a/transforming/ksql/README.md b/transforming/ksql/README.md index f6d782e5..4940faed 100644 --- a/transforming/ksql/README.md +++ b/transforming/ksql/README.md @@ -165,9 +165,9 @@ You can run the example backing this tutorial in one of two ways: locally with t ### Run the commands - Login to the [Confluent Cloud Console](https://confluent.cloud/). Select `Environments` in the lefthand navigation, + Login to the [Confluent Cloud Console](https://confluent.cloud/). Select `Environments` in the left-hand navigation, and then click the `ksqldb-tutorial` environment tile. Click the `ksqldb-tutorial` Kafka cluster tile, and then - select `ksqlDB` in the lefthand navigation. + select `ksqlDB` in the left-hand navigation. The cluster may take a few minutes to be provisioned. Once its status is `Up`, click the cluster name and scroll down to the editor. diff --git a/tumbling-windows/ksql/README.md b/tumbling-windows/ksql/README.md index 49d3d674..de5a0c23 100644 --- a/tumbling-windows/ksql/README.md +++ b/tumbling-windows/ksql/README.md @@ -191,9 +191,9 @@ You can run the example backing this tutorial in one of two ways: locally with t ### Run the commands - Login to the [Confluent Cloud Console](https://confluent.cloud/). Select `Environments` in the lefthand navigation, + Login to the [Confluent Cloud Console](https://confluent.cloud/). Select `Environments` in the left-hand navigation, and then click the `ksqldb-tutorial` environment tile. Click the `ksqldb-tutorial` Kafka cluster tile, and then - select `ksqlDB` in the lefthand navigation. + select `ksqlDB` in the left-hand navigation. The cluster may take a few minutes to be provisioned. Once its status is `Up`, click the cluster name and scroll down to the editor.