Flink SQL查询HBase维表

背景

主流取自Kafka, 通过Flink HBase SQL Connector 从HBase读取维度数据,进行数据补全。
本文代码基于Flink 1.12.0版本

引入依赖

        <dependency>
            <groupId>org.apache.flink</groupId>
            <artifactId>flink-connector-hbase-2.2_${scala.binary.version}</artifactId>
            <version>${flink.version}</version>
        </dependency>

注册Kakfa table

CREATE TABLE fact(
                key STRING,
                value1 STRING,
                proctime AS PROCTIME()
                ) WITH (
                'connector' = 'kafka',
                'topic' = 'test-hb',
                'properties.bootstrap.servers' = 'localhost:9092',
                'properties.group.id' = 'testGroup',
                'scan.startup.mode' = 'latest-offset',
                'format' = 'json'
                );

注册Hbase table

CREATE TABLE hb_stream(
                rowkey String, 
                cf ROW<age String, name String>,
                PRIMARY KEY (rowkey) NOT ENFORCED) with(
                'connector' = 'hbase-2.2',
                'table-name' = 'test',
                'zookeeper.quorum' = 'localhost:12181'
                )

如果HBase表有多个column family,可以如下定义:

CREATE TABLE hTable (
 rowkey String,
 family1 ROW<q1 INT>,
 family2 ROW<q2 STRING, q3 BIGINT>,
 family3 ROW<q4 DOUBLE, q5 BOOLEAN, q6 STRING>,
 PRIMARY KEY (rowkey) NOT ENFORCED
) WITH (
 'connector' = 'hbase-2.2',
 'table-name' = 'test',
 'zookeeper.quorum' = 'localhost:2181'
);

查询维度数据

select * from fact 
left join hb_stream 
FOR SYSTEM_TIME AS OF fact.proctime 
on fact.key = hb_stream.rowkey 
and fact.value1 = hb_stream.cf.name

完整代码

public class HBaseDimDemo {
    public static void main(String[] args) throws Exception {
        StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();
        EnvironmentSettings environmentSettings = EnvironmentSettings.newInstance().useBlinkPlanner().inStreamingMode().build();
        StreamTableEnvironment tenv = StreamTableEnvironment.create(env,environmentSettings);

        String kafkaDdlString = "CREATE TABLE fact(\n" +
                "    key STRING,\n" +
                "    value1 STRING,\n" +
                "    proctime AS PROCTIME()\n" +
                ") WITH (\n" +
                "    'connector' = 'kafka',\n" +
                "    'topic' = 'test-hb',\n" +
                "    'properties.bootstrap.servers' = 'localhost:9092',\n" +
                "    'properties.group.id' = 'testGroup',\n" +
                "    'scan.startup.mode' = 'latest-offset',\n" +
                "    'format' = 'json'\n" +
                ")";

        String ddlString = "CREATE TABLE hb_stream(\n" +
                "    rowkey String, \n" +
                "    cf ROW<age String, name String>,\n" +
                "PRIMARY KEY (rowkey) NOT ENFORCED) with(\n" +
                "    'connector' = 'hbase-2.2',\n" +
                "    'table-name' = 'test',\n" +
                "    'zookeeper.quorum' = 'localhost:12181'\n" +
                ")";

        tenv.executeSql(kafkaDdlString);
        tenv.executeSql(ddlString);

        //连接条件中必须包含rowkey
        Table table = tenv.sqlQuery("select * from fact " +
                "left join hb_stream FOR SYSTEM_TIME AS OF fact.proctime on fact.key = hb_stream.rowkey and fact.value1 = hb_stream.cf.name");
        tenv.toRetractStream(table, Row.class).print();
        table.printSchema();

        env.execute();


    }
}

适用场景

  1. 主流数据量大,维度表要能提供高并发的的查询服务
  2. 维度数据量级大, 适用普通关系数据库承载导致查询性能低
  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 5
    评论
FlinkSQL中如何关联Hbase大表,如果关联字段不是Hbase维表的rowkey,将会触发全表扫描。FlinkSQLHbase connector不会处理索引,所以我们可以采用自己维护索引表的方式来解决这个问题。具体实现方式可以参考Hbase二级索引的知识。[1] 在FlinkSQL中,我们可以通过Flink HBase SQL Connector从HBase读取维度数据,进行数据补全。首先需要引入相关依赖,如下所示: ```xml <dependency> <groupId>org.apache.flink</groupId> <artifactId>flink-connector-hbase-2.2_${scala.binary.version}</artifactId> <version>${flink.version}</version> </dependency> ``` 然后可以注册Kafka表和Hbase表,示例如下: ```sql CREATE TABLE fact( key STRING, value1 STRING, proctime AS PROCTIME() ) WITH ( 'connector' = 'kafka', 'topic' = 'test-hb', 'properties.bootstrap.servers' = 'localhost:9092', 'properties.group.id' = 'testGroup', 'scan.startup.mode' = 'latest-offset', 'format' = 'json' ); CREATE TABLE hb_stream( rowkey String, cf ROW<age String, name String>, PRIMARY KEY (rowkey) NOT ENFORCED ) WITH ( 'connector' = 'hbase-2.2', 'table-name' = 'test', 'zookeeper.quorum' = 'localhost:12181' ); ``` 通过以上配置,我们可以在FlinkSQL中使用Hbase维表进行关联操作。[2] 在实时数据开发中,通常会使用Spark或Flink消费Kafka数据流,并与外部数据库(如Hbase、MySQL等)进行维表关联。如果外部数据库中既包含维度数据,又包含大量的事实数据,并且这些数据更新频繁且数据量巨大,我们需要选择一个适合的外部数据库来支持实时场景的需求。Hbase是一个可以满足海量数据高效读写性能的外部数据库,因此在这种情况下可以选择使用Hbase作为支持。[3]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

修破立生

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值