TableSource
提供对存储在外部系统,例如数据库,键值存储,消息队列或文件中的数据的访问。
TableSink
将表发送到外部存储系统,例如数据库,键值存储,消息队列或文件系统(在不同的编码中,例如CSV,Parquet或ORC)。
定义TableSource
TableSource是一个通用接口,它允许Table API和SQL查询访问存储在外部系统中的数据。它提供了表的模式以及映射到具有表模式的行的记录。根据TableSource是在流式查询还是批量查询中使用,记录将生成为DataSet或DataStream。
如果在流查询中使用了一个TableSource,它必须实现StreamTableSource源接口,如果在批处理查询中使用了它,它必须实现BatchTableSource源接口。TableSource还可以实现这两个接口,并用于流查询和批处理查询。
StreamTableSource和BatchTableSource扩展了基本接口TableSource,TableSource定义了以下方法:
TableSource {
//返回表的结构,即表的字段的名称和类型。
public TableSchema getTableSchema();
//返回DataStream(StreamTableSource)或DataSet(BatchTableSource)的物理类型以及TableSource生成的记录。
public TypeInformation getReturnType();
//返回描述TableSource的字符串 。此方法是可选的,仅用于显示目的。
public String explainSource();
}
TableSource接口将逻辑表模式与返回的DataStream或DataSet的物理类型分隔开来。因此,表模式的所有字段(getTableSchema())必须映射到具有相应的物理返回类型(getReturnType())的字段。默认情况下,此映射是基于字段名完成的。
定义BatchTableSource
BatchTableSource接口扩展了TableSource接口,并定义一个额外的方法:
BatchTableSource implements TableSource {
//返回包含表数据的DataSet。
public DataSet getDataSet(ExecutionEnvironment execEnv);
}
定义StreamTableSource
StreamTableSource接口扩展了TableSource接口,并定义一个额外的方法:
StreamTableSource implements TableSource {
//返回带有表数据的DataStream。
public DataStream getDataStream(StreamExecutionEnvironment execEnv);
}
定义TableSink
TableSink指定如何将表发送到外部系统或位置。 该接口是通用的,因此它可以支持不同的存储位置和格式。 批处理表和流表有不同的表接收器。通用接口定义如下所示:
TableSink {
public TypeInformation getOutputType();
public String[] getFieldNames();
public TypeInformation[] getFieldTypes();
public TableSink configure(String[] fieldNames, TypeInformation[] fieldTypes);
}
BatchTableSink
定义一个外部TableSink以发出一个批处理表。
该接口如下所示:
BatchTableSink implements TableSink {
public void emitDataSet(DataSet dataSet);
}
AppendStreamTableSink
定义拓展TableSink以发出仅包含插入更改的流表。
接口定义如下:
AppendStreamTableSink implements TableSink {
public void emitDataStream(DataStream dataStream);
}
RetractStreamTableSink
定义拓展TableSink以发出包含插入,更新和删除更改的流表。
接口定义如下:
RetractStreamTableSink implements TableSink> {
public TypeInformation getRecordType();
public void emitDataStream(DataStream> dataStream);
}
该表将被转换为累积和撤销消息流,这些消息被编码为Java Tuple2。 第一个字段是一个布尔标志,用于指示消息类型(true表示插入,false表示删除)。 第二个字段保存所请求类型T的记录。
UpsertStreamTableSink
定义拓展TableSink以发出包含插入,更新和删除更改的流表。
接口定义如下:
UpsertStreamTableSink implements TableSink> {
public void setKeyFields(String[] keys);
public void setIsAppendOnly(boolean isAppendOnly);
public TypeInformation getRecordType();
public void emitDataStream(DataStream> dataStream);
}
该表必须具有唯一的键字段(原子或复合)或仅附加。 如果表没有唯一键且不是仅附加,则抛出TableException。 表的唯一键由UpsertStreamTableSin 的 setKeyFields()方法配置。
该表将被转换为upsert和delete消息流,这些消息被编码为Java Tuple2。 第一个字段是一个布尔标志,用于指示消息类型。 第二个字段保存所请求类型T的记录。
具有true标记的布尔字段的消息是已配置密钥的upsert消息。 带有false标志的消息是已配置密钥的delete消息。 如果表是仅附加的,则所有消息都将具有true标志,并且必须解释为插入。
定义TableFactory
TableFactory允许从基于字符串的属性创建不同的表相关实例。 调用所有可用工厂以匹配给定的属性集和相应的工厂类。
每个表工厂都需要实现以下接口:
package org.apache.flink.table.factories;
interface TableFactory {
Map requiredContext();
List supportedProperties();
}