Flink 1.9 Table API问题 读取kafka

本文主要探讨了在使用Flink 1.9 Table API时遇到的错误——找不到合适的DeserializationSchemaFactory。内容包括问题背景,即Kafka数据的JSON格式,以及错误发生的原因可能与环境变量和依赖相关。作者提供了1.62版本正常运行的代码对比,并详细说明了Flink 1.9版本中连接Kafka的步骤,包括需要的特定依赖和可能遇到的解决办法。
摘要由CSDN通过智能技术生成

Flink 1.9 API问题

Flink: Could not find a suitable table factory for 'org.apache.flink.table.factories.DeserializationSchemaFactory' in the classpath

 

kafka数据格式:

{"user_id": "346146", "item_id":"851377", "category_id": "4789432", "behavior": "pv", "ts": "2017-11-26T01:24:19Z"}
 

错误原因就是环境变量 跟 依赖的原因 ,目前我只是简单的做了实验,本地代码是可以运行的。

1,先上一个1.62版本的代码,可以运行:

package com.coder.flink.core.table;


import org.apache.flink.api.common.typeinfo.Types;
import org.apache.flink.streaming.api.datastream.DataStream;
import org.apache.flink.streaming.api.environment.StreamExecutionEnvironment;
import org.apache.flink.table.api.Table;
import org.apache.flink.table.api.TableEnvironment;
import org.apache.flink.table.api.java.StreamTableEnvironment;
import org.apache.flink.table.descriptors.Json;
import org.apache.flink.table.descriptors.Kafka;
import org.apache.flink.table.descriptors.Schema;
import org.apache.flink.types.Row;


public class TestDemo {
    public static void main(String[] args) {

        StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();
        env.setParallelism(1);
//        env.enableCheckpointing(5000);
        StreamTableEnvironment tableEnv = TableEnvironment.getTableEnvironment(env);

        Kafka kafka = new Kafka()
                .version("0.10")
                .topic("user_behavior")
                .property("bootstrap.servers", "node2.hadoop:9092")
                .property("zookeeper.connect", "node2.hadoop:2181");
        tableEnv.connect(kafka)
                .withFormat(
                        new Json().failOnMissingField(true).deriveSchema()
                )
                .withSchema(
                        new Schema()
                                .field("user_id", Types.INT)
                                .field("item_id", Types.INT)
                                .field("category_id", Types.INT)
                                .field("behavior", Types.STRING)
                                .field("ts", Types.STRING)
                )
                .inAppendMode()
                .registerTableSource("tmp_table");

        String sql = "select * from tmp_table";
        Table table = tableEnv.sqlQuery(sql);
        DataStream<Row> rowDataStream = tableE
  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
Flink 1.14 版本中,使用 SQL APIKafka读取数据并根据分区进行读取的步骤如下: 1. 首先,需要在 Flink 作业中添加对 Kafka 的依赖,例如: ```xml <dependency> <groupId>org.apache.flink</groupId> <artifactId>flink-connector-kafka_2.12</artifactId> <version>1.14.0</version> </dependency> ``` 2. 接着,在 Flink SQL 中创建一个 Kafka 表,并指定需要读取Kafka 主题、Kafka 服务器地址、分区等信息,例如: ```sql CREATE TABLE kafka_table ( id BIGINT, name STRING, event_time TIMESTAMP(3), WATERMARK FOR event_time AS event_time - INTERVAL '5' SECOND ) WITH ( 'connector' = 'kafka', 'topic' = 'my_topic', 'properties.bootstrap.servers' = 'localhost:9092', 'properties.group.id' = 'my_group', 'scan.startup.mode' = 'earliest-offset', 'format' = 'json', 'json.timestamp-format.standard' = 'ISO-8601' ); ``` 在上面的代码中,我们使用了 Flink SQL 的 `CREATE TABLE` 语句来创建一个名为 `kafka_table` 的表,并指定了需要从 Kafka读取的数据格式为 JSON 格式。 3. 接下来,可以使用 Flink SQL 中的 `SELECT` 语句来查询 Kafka 表中的数据,例如: ```sql SELECT id, name, event_time FROM kafka_table WHERE _partition = 0; ``` 在上面的代码中,我们使用了 `WHERE` 子句来筛选需要读取的分区,这里筛选了分区编号为 0 的数据。 4. 最后,可以使用 Flink SQL 的 `INSERT INTO` 语句将查询结果写入到其他的表或者流中,例如: ```sql INSERT INTO result_table SELECT id, name, event_time FROM kafka_table WHERE _partition = 0; ``` 在上面的代码中,我们使用了 `INSERT INTO` 语句将查询结果写入到名为 `result_table` 的表中。
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值