使用FlinkSQL将数据写入到ClickHouse

39 篇文章 12 订阅
10 篇文章 2 订阅

使用FlinkSQL将地区主题数据写入到ClickHouse

一、需求分析与思路

  1. 定义Table流环境
  2. 把数据源定义为动态表
  3. 通过SQL查询出结果表
  4. 把结果表转换为数据流
  5. 把数据流写入目标数据库

如果是Flink官方支持的数据库,也可以直接把目标数据表定义为动态表,用insert into 写入。由于ClickHouse目前官方没有支持的jdbc连接器(目前支持Mysql、 PostgreSQL、Derby)。

阿里云有实现好的connector, 我们使用这个connector.参考地址: https://help.aliyun.com/document_detail/185696.html?spm=a2c4g.11186623.6.574.d9c541ea3J78mc

二、功能实现

数据来源于topic: dwm_order_wide

2.1 导入ClickHouse连接器

<dependency>
    <groupId>com.aliyun</groupId>
    <artifactId>flink-connector-clickhouse</artifactId>
    <version>1.11.0</version>
</dependency>

注意:

  1. 由于该连接器目前在远程的maven仓库中找不到, 我们需要下载该连接器, 然后安装到本地仓库使用
  2. 下载地址: https://clickhouse-release-open-access.oss-cn-shanghai.aliyuncs.com/doc-data/flink-connector-clickhouse-1.11.0.jar?spm=a2c4g.11186623.2.6.d9c541ea3J78mc&file=flink-connector-clickhouse-1.11.0.jar
  3. 假设jar包被下载在如下目录: C:\Users\lzc\Desktop\connector
  4. 安装jar到本地仓库(需要保证mvn命令已经配置到了path中):
mvn install:install-file -Dfile=C:\Users\lzc\Desktop\connector\flink-connector-clickhouse-1.11.0.jar
 -DgroupId=com.aliyun -DartifactId=flink-connector-clickhouse -Dversion=1.11.0 -Dpackaging=jar

2.2 在ClickHouse中创建表

use gmall2021;
create table province_stats_2021 (
   stt DateTime,
   edt DateTime,
   province_id  UInt64,
   province_name String,
   area_code String ,
   iso_code String,
   iso_3166_2 String , 
   order_amount Decimal64(2),
   order_count UInt64, 
   ts UInt64
)engine =ReplacingMergeTree( ts)
        partition by  toYYYYMMDD(stt)
        order by   (stt,edt,province_id );

2.3 具体实现代码

package com.gmall.realtime.app.dws;

import com.gmall.realtime.app.BaseSqlAPP;
import org.apache.flink.table.api.Table;
import org.apache.flink.table.api.bridge.java.StreamTableEnvironment;

public class DWSProvinceStateApp extends BaseSqlAPP {
    public static void main(String[] args) {
        new DWSProvinceStateApp().init(30003,2,"DWSProvinceStateApp");
    }

    @Override
    public void run(StreamTableEnvironment tenv) {

        //1.建表与source关联  t1 dwm_order_wide
       tenv.executeSql("create table order_wide(" +
                " province_id  bigint, " +
                " province_name  string, " +
                " province_area_code  string, " +
                " province_iso_code  string, " +
                " province_3166_2_code  string, " +
                " order_id  bigint, " +
                " split_total_amount  decimal(12,2), " +
                " create_time  string, " +
                " event_time  as to_timestamp(create_time), " +
                " watermark for event_time as event_time - interval '5' second " +
                ")with(" +
                " 'connector' = 'kafka'," +
                " 'properties.bootstrap.servers' = 'hadoop162:9092,hadoop163:9092,hadoop164:9092', " +
                " 'properties.group.id' = 'DWSProvinceStateApp', " +
                " 'topic' = 'dwm_order_wide', " +
                " 'scan.startup.mode' = 'latest-offset', " +
                " 'format' = 'json' " +
                ")");


      //2. 建表与sink表关联 t2
        tenv.executeSql("create table province_stats_2021(" +
                " stt string, " +
                " edt string, " +
                " province_id  bigint, " +
                " province_name  string, " +
                " area_code  string, " +
                " iso_code  string, " +
                " iso_3166_2  string, " +
                " order_amount  decimal(20,2), " +
                " order_count  bigint, " +
                " ts  bigint, " +
                " primary key(stt,edt,province_id) not enforced" +
                ")with(" +
                " 'connector' = 'clickhouse', " +
                " 'url' = 'clickhouse://hadoop162:8123', " +
                " 'database-name' = 'gmall2021', " +
                " 'table-name' = 'province_stats_2021', " +
                " 'sink.batch-size' = '100', " +
                " 'sink.flush-interval' = '1000', " +
                " 'sink.max-retries' = '3' " +
                ")");



        //3.查询t1,把结果写入到t2
        final Table table = tenv.sqlQuery("select " +
                " date_format(tumble_start(event_time,  interval '10' second),'yyyy-MM-dd HH:mm:ss'), " +
                " date_format(tumble_end(event_time,  interval '10' second),'yyyy-MM-dd HH:mm:ss'), " +
                " province_id, " +
                " province_name, " +
                " province_area_code, " +
                " province_iso_code, " +
                " province_3166_2_code, " +
                " sum(split_total_amount) order_amount, " +
                " count(distinct order_id) order_count, " +
                " unix_timestamp()*1000  ts" +
                " from  order_wide " +
                " group by " +
                " tumble(event_time, interval '10' second)," +
                " province_id, " +
                " province_name, " +
                " province_area_code, " +
                " province_iso_code, " +
                " province_3166_2_code");

        table.executeInsert("province_stats_2021");


    }
}

  • 3
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 15
    评论
### 回答1: 我可以给你一些建议来帮助你使用Flink SQL数据写入ClickHouse。首先,你可以使用Flink SQL访问和处理数据,然后将处理后的数据写入ClickHouse。其次,你还可以使用Flink SQL提供的支持,将数据从其他数据源加载到ClickHouse中。最后,你可以使用Flink SQL的查询功能,从ClickHouse中查询数据。 ### 回答2: Flink SQL是Apache Flink的一种语言接口,用于使用SQL语句来处理和分析流式数据。而ClickHouse是一个快速、可扩展的列式数据库管理系统,专注于在线分析处理(OLAP)领域。 首先,要在Flink中将数据写入ClickHouse,需要安装并配置好FlinkClickHouse。确保Flink集群和ClickHouse实例可以互相通信。 然后,可以通过以下步骤将数据Flink写入ClickHouse: 1. 创建一个Flink Table,并指定要写入的目标表格。可以使用类似于以下代码的方式创建一个表: ```sql CREATE TABLE clickhouse_table ( id INT, name STRING, age INT ) WITH ( 'connector' = 'clickhouse', 'url' = 'clickhouse://localhost:8123', 'table-name' = 'target_table', 'username' = 'your_username', 'password' = 'your_password' ); ``` 2. 在Flink任务中,将数据流转换为一个表,并将表注册为一个临时视图。可以使用类似于以下代码的方式将数据流转换为一个表: ```java StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment(); StreamTableEnvironment tEnv = StreamTableEnvironment.create(env); Table sourceTable = tEnv.fromDataStream(dataStream, "id, name, age"); tEnv.createTemporaryView("source_view", sourceTable); ``` 3. 在Flink任务中,使用INSERT INTO语句将数据从临时视图写入目标表。可以使用类似于以下代码的方式将数据写入ClickHouse: ```java tEnv.executeSql("INSERT INTO clickhouse_table SELECT id, name, age FROM source_view"); ``` 4. 启动Flink任务并观察数据是否成功写入ClickHouse。可以使用Flink的日志或ClickHouse的查询语句来验证数据是否被正确写入。 总体而言,通过Flink SQL写入ClickHouse需要完成以下几个步骤:创建目标表、将数据流转换为表、注册视图、使用INSERT INTO语句将数据写入目标表。这样就可以将数据Flink流式处理引擎写入ClickHouse数据库中。 ### 回答3: Flink SQL是Apache Flink的一种查询语言,用于在Flink中执行SQL查询和操作。而ClickHouse是一种开源的分布式列式数据库,具有高性能和可伸缩性。因此,我们可以使用Flink SQL数据写入ClickHouse。 在Flink写入ClickHouse的过程如下: 1. 首先,我们需要在Flink的应用程序中引入相应的依赖,包括Flink SQLClickHouse的连接驱动程序。 2. 然后,在Flink应用程序中配置连接到ClickHouse的相关信息,如ClickHouse的地址、端口号、用户名和密码等。 3. 接下来,我们可以使用Flink SQL语句创建一个输出表,指定将数据写入ClickHouse的目标表和字段映射关系。 4. 在Flink应用程序中,我们可以通过编写SQL查询语句来读取需要的数据,并将结果写入到之前定义的输出表中。 5. 最后,通过运行Flink应用程序,Flink会根据SQL语句从数据流中读取数据,并将其写入ClickHouse中。 综上所述,使用Flink SQL写入ClickHouse的过程可以简化进行数据处理和分析的流程,并享受FlinkClickHouse各自的优势。这种方式也提供了灵活性和可扩展性,可以满足大规模数据处理和分析的需求。
评论 15
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值