# 从 Flink 的 SQL 中将数据发送到 Kafka ,然后再将 Kafka 中的数据写入到 StarRocks 中

## 整体流程

| 步骤 | 操作 |
| --- | --- |
| 1 | 在 Flink SQL 中定义数据流,将数据发送到 Kafka |
| 2 | 创建 Kafka 生产者,从 Kafka 中读取数据 |
| 3 | 将读取的数据写入 StarRocks 数据库中 |

## 步骤详解

### 步骤 1: 在 Flink SQL 中定义数据流,将数据发送到 Kafka

```java
// 创建 Flink TableEnvironment
TableEnvironment tEnv = TableEnvironment.create(env);

// 定义 Kafka 连接属性
Properties properties = new Properties();
properties.setProperty("bootstrap.servers", "localhost:9092");

// 创建 Kafka 生产者
FlinkKafkaProducer kafkaProducer = new FlinkKafkaProducer<>("topic", new SimpleStringSchema(), properties);

// 在 Flink SQL 中定义数据流,将数据发送到 Kafka
tEnv.executeSql("CREATE TABLE KafkaTable (id INT, name STRING) WITH ('connector' = 'kafka', 'topic' = 'topic', 'properties.bootstrap.servers' = 'localhost:9092')");
tEnv.executeSql("INSERT INTO KafkaTable SELECT id, name FROM SourceTable"); // SourceTable 是原始数据表
```

### 步骤 2: 创建 Kafka 生产者,从 Kafka 中读取数据

```java
// 定义 Kafka 消费者属性
Properties kafkaProps = new Properties();
kafkaProps.setProperty("bootstrap.servers", "localhost:9092");

// 创建 FlinkKafkaConsumer
FlinkKafkaConsumer kafkaConsumer = new FlinkKafkaConsumer<>("topic", new SimpleStringSchema(), kafkaProps);

// 从 Kafka 中读取数据
DataStream kafkaDataStream = env.addSource(kafkaConsumer);
```

### 步骤 3: 将读取的数据写入 StarRocks 数据库中

```java
kafkaDataStream.addSink(new RichSinkFunction() {
@Override
public void invoke(String value, Context context) throws Exception {
// 连接 StarRocks 数据库
Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/StarRocksDB", "user", "password");
Statement stmt = conn.createStatement();

// 执行插入操作
String insertQuery = "INSERT INTO StarRocksTable VALUES (" + value + ")";
stmt.execute(insertQuery);

// 关闭连接
stmt.close();
conn.close();
}
});
```

在上述代码中,我们首先通过 Flink SQL 将数据发送到 Kafka,然后创建 Kafka 消费者从 Kafka 中读取数据,在读取的数据上添加一个 SinkFunction,将数据写入 StarRocks 数据库中的表中。

这样整个流程就完成了,将数据从 Flink SQL 中发送到 Kafka,再从 Kafka 中读取数据写入 StarRocks 数据库中。希望这篇文章对你有所帮助!