) WITH (
‘connector’ = ‘user_defined’,
‘format’ = ‘json’,
‘class.name’ = ‘flink.examples.sql._03.source_sink.table.user_defined.UserDefinedSource’
);
– 临时视图
CREATE TEMPORARY VIEW query_view as
SELECT *
FROM source_table;
永久表:需要外部 Catalog(例如 Hive Metastore)来持久化表的元数据。一旦永久表被创建,它将对任何连接到这个 Catalog 的 Flink Session 可见且持续存在,直至从 Catalog 中被明确删除。如下案例:
– 永久外部表。需要外部 Catalog 持久化!!!
CREATE TABLE source_table (
user_id BIGINT,
name
STRING
) WITH (
‘connector’ = ‘user_defined’,
‘format’ = ‘json’,
‘class.name’ = ‘flink.examples.sql._03.source_sink.table.user_defined.UserDefinedSource’
);
– 永久视图。需要外部 Catalog 持久化!!!
CREATE VIEW query_view as
SELECT *
FROM source_table;
🚀 注意:如果临时表和永久表使用了相同的名称(Catalog名.数据库名.表名)。那么在这个 Flink Session 中,你的任务访问到这个表时,访问到的永远是临时表(即 相同名称的表,临时表会屏蔽永久表)。
2.5 SQL 外部数据表
由于目前在实时数据的场景中多以消息队列作为数据表。此处就以 Kafka 为例创建一个外部数据表。
2.5.1 Table API 创建外部数据表
public static void main(String[] args) throws Exception {
StreamExecutionEnvironment env =
StreamExecutionEnvironment.createLocalEnvironmentWithWebUI(new Configuration());
EnvironmentSettings settings = EnvironmentSettings
.newInstance()
.useBlinkPlanner()
.inStreamingMode()
.build();
StreamTableEnvironment tEnv = StreamTableEnvironment.create(env, settings);
// kafka 数据源
DataStream r = env.addSource(new FlinkKafkaConsumer(xxx));
// 将 DataStream 转为一个 Table API 中的 Table 对象进行使用
Table sourceTable = tEnv.fromDataStream(r
, Schema
.newBuilder()
.column(“f0”, “string”)
.column(“f1”, “string”)
.column(“f2”, “bigint”)
.columnByExpression(“proctime”, “PROCTIME()”)
.build());
tEnv.createTemporaryView(“source_table”, sourceTable);
String selectWhereSql = “select f0 from source_table where f1 = ‘b’”;
Table resultTable = tEnv.sqlQuery(selectWhereSql);
tEnv.toRetractStream(resultTable, Row.class).print();
env.execute();
}
上述案例中,Table API 将一个 DataStream 的结果集通过 StreamTableEnvironment::fromDataStream
转为一个 Table 对象来使用。
2.5.2 SQL API 创建外部数据表
EnvironmentSettings settings = EnvironmentSettings
.newInstance()
.useBlinkPlanner()
.inStreamingMod