用户自定义source & sink

动态表(dynamic table)是Flink的Table&SQL API的核心概念,用于以统一方式处理有界和无界数据。

因为动态表只是一个逻辑概念,所以Flink本身并不拥有数据。相反,动态表的内容存储在外部系统(例如数据库,键值存储,消息队列)或文件中。

动态源(dynamic source)和动态接收器(dynamic sink)可用于从外部系统读取和写入数据。

TableSource提供对存储在外部系统,例如数据库,键值存储,消息队列或文件中的数据的访问。
TableSink 将表发送到外部存储系统,例如数据库,键值存储,消息队列或文件系统(在不同的编码中,例如CSV,Parquet或ORC)。

定义TableSource

TableSource是一个通用接口,它允许Table API和SQL查询访问存储在外部系统中的数据。它提供了表的模式以及映射到具有表模式的行的记录。根据TableSource是在流式查询还是批量查询中使用,记录将生成为DataSet或DataStream。
如果在流查询中使用了一个TableSource,它必须实现StreamTableSource源接口,如果在批处理查询中使用了它,它必须实现BatchTableSource源接口。TableSource还可以实现这两个接口,并用于流查询和批处理查询。
StreamTableSource和BatchTableSource扩展了基本接口TableSource,TableSource定义了以下方法:

TableSource<T> {
  //返回表的结构,即表的字段的名称和类型。
  public TableSchema getTableSchema();
  //返回DataStream(StreamTableSource)或DataSet(BatchTableSource)的物理类型以及TableSource生成的记录。
  public TypeInformation<T> getReturnType();
  //返回描述TableSource的字符串 。此方法是可选的,仅用于显示目的。
  public String explainSource();
}

TableSource接口将逻辑表模式与返回的DataStream或DataSet的物理类型分隔开来。因此,表模式的所有字段(getTableSchema())必须映射到具有相应的物理返回类型(getReturnType())的字段。默认情况下,此映射是基于字段名完成的。

定义BatchTableSource

BatchTableSource接口扩展了TableSource接口,并定义一个额外的方法:

BatchTableSource<T> implements TableSource<T> {
  //返回包含表数据的DataSet。
  public DataSet<T> getDataSet(ExecutionEnvironment execEnv);
}

定义StreamTableSource

StreamTableSource接口扩展了TableSource接口,并定义一个额外的方法:

StreamTableSource<T> implements TableSource<T> {
  //返回带有表数据的DataStream。
  public DataStream<T> getDataStream(StreamExecutionEnvironment execEnv);
}

定义TableSink

TableSink指定如何将表发送到外部系统或位置。 该接口是通用的,因此它可以支持不同的存储位置和格式。 批处理表和流表有不同的表接收器。通用接口定义如下所示:

TableSink<T> {

  public TypeInformation<T> getOutputType();

  public String[] getFieldNames();

  public TypeInformation[] getFieldTypes();

  public TableSink<T> configure(String[] fieldNames, TypeInformation[] fieldTypes);
}

BatchTableSink

定义一个外部TableSink以发出一个批处理表。

该接口如下所示:

BatchTableSink<T> implements TableSink<T> {

  public void emitDataSet(DataSet<T> dataSet);
}

AppendStreamTableSink

定义拓展TableSink以发出仅包含插入更改的流表。
接口定义如下:

AppendStreamTableSink<T> implements TableSink<T> {

  public void emitDataStream(DataStream<T> dataStream);
}

RetractStreamTableSink

定义拓展TableSink以发出包含插入,更新和删除更改的流表。

接口定义如下:

RetractStreamTableSink<T> implements TableSink<Tuple2<Boolean, T>> {

  public TypeInformation<T> getRecordType();

  public void emitDataStream(DataStream<Tuple2<Boolean, T>> dataStream);
}

该表将被转换为累积和撤销消息流,这些消息被编码为Java Tuple2。 第一个字段是一个布尔标志,用于指示消息类型(true表示插入,false表示删除)。 第二个字段保存所请求类型T的记录。

UpsertStreamTableSink

定义拓展TableSink以发出包含插入,更新和删除更改的流表。
接口定义如下:

UpsertStreamTableSink<T> implements TableSink<Tuple2<Boolean, T>> {

  public void setKeyFields(String[] keys);

  public void setIsAppendOnly(boolean isAppendOnly);

  public TypeInformation<T> getRecordType();

  public void emitDataStream(DataStream<Tuple2<Boolean, T>> 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<String, String> requiredContext();

  List<String> supportedProperties();
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 225,124评论 6 523
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 96,453评论 3 404
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 172,386评论 0 368
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 61,136评论 1 301
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 70,142评论 6 400
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 53,593评论 1 315
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 41,958评论 3 429
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 40,944评论 0 279
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 47,477评论 1 324
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 39,512评论 3 346
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 41,639评论 1 355
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 37,227评论 5 351
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 42,971评论 3 340
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 33,397评论 0 25
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 34,550评论 1 277
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 50,203评论 3 381
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 46,713评论 2 366

推荐阅读更多精彩内容

  • 点击查看原文 Web SDK 开发手册 SDK 概述 网易云信 SDK 为 Web 应用提供一个完善的 IM 系统...
    layjoy阅读 13,803评论 0 15
  • 1. 简介 1.1 什么是 MyBatis ? MyBatis 是支持定制化 SQL、存储过程以及高级映射的优秀的...
    笨鸟慢飞阅读 5,541评论 0 4
  • Zookeeper用于集群主备切换。 YARN让集群具备更好的扩展性。 Spark没有存储能力。 Spark的Ma...
    Yobhel阅读 7,291评论 0 34
  • 一. Java基础部分.................................................
    wy_sure阅读 3,819评论 0 11
  • 世界上有两种人,一种是善人,一种是恶人
    文墨学子阅读 51评论 0 0