CN113900944A - 一种应用于Flink SQL的逻辑验证方法和装置 - Google Patents

一种应用于Flink SQL的逻辑验证方法和装置 Download PDF

Info

Publication number
CN113900944A
CN113900944A CN202111185132.2A CN202111185132A CN113900944A CN 113900944 A CN113900944 A CN 113900944A CN 202111185132 A CN202111185132 A CN 202111185132A CN 113900944 A CN113900944 A CN 113900944A
Authority
CN
China
Prior art keywords
sql
data
statement
building
logic verification
Prior art date
Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
Pending
Application number
CN202111185132.2A
Other languages
English (en)
Inventor
何会远
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
Beijing Jingdong Century Trading Co Ltd
Beijing Wodong Tianjun Information Technology Co Ltd
Original Assignee
Beijing Jingdong Century Trading Co Ltd
Beijing Wodong Tianjun Information Technology Co Ltd
Priority date (The priority date is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the date listed.)
Filing date
Publication date
Application filed by Beijing Jingdong Century Trading Co Ltd, Beijing Wodong Tianjun Information Technology Co Ltd filed Critical Beijing Jingdong Century Trading Co Ltd
Priority to CN202111185132.2A priority Critical patent/CN113900944A/zh
Publication of CN113900944A publication Critical patent/CN113900944A/zh
Pending legal-status Critical Current

Links

Images

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F11/00Error detection; Error correction; Monitoring
    • G06F11/36Preventing errors by testing or debugging software
    • G06F11/3604Software analysis for verifying properties of programs
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F16/00Information retrieval; Database structures therefor; File system structures therefor
    • G06F16/20Information retrieval; Database structures therefor; File system structures therefor of structured data, e.g. relational data
    • G06F16/24Querying
    • G06F16/242Query formulation
    • G06F16/2433Query languages

Landscapes

  • Engineering & Computer Science (AREA)
  • Theoretical Computer Science (AREA)
  • Physics & Mathematics (AREA)
  • General Engineering & Computer Science (AREA)
  • General Physics & Mathematics (AREA)
  • Computational Linguistics (AREA)
  • Databases & Information Systems (AREA)
  • Data Mining & Analysis (AREA)
  • Mathematical Physics (AREA)
  • Software Systems (AREA)
  • Computer Hardware Design (AREA)
  • Quality & Reliability (AREA)
  • Debugging And Monitoring (AREA)

Abstract

本发明公开了一种应用于Flink SQL的逻辑验证方法和装置,涉及计算机技术领域。该方法的一具体实施方式包括:获取待验证逻辑的SQL文本,对SQL文本中的SQL语句进行分割,得到多条SQL语句;分析插入SQL语句以获取创建的对象,查找用于创建对象的建表DDL语句;将建表DDL语句中的外部组件,替换为与对象的类型对应的逻辑验证组件,进而基于逻辑验证组件对SQL文本进行逻辑验证。该实施方式针对Flink SQL框架中已有的DataGen和Print组件进行改造,得到ApusDataGen和ApusPrint两个Connector,以更好的适配产品展示数据,方便用户快速校验SQL逻辑的准确性,便于提前发现问题,缩短开发周期。

Description

一种应用于Flink SQL的逻辑验证方法和装置
技术领域
本发明涉及计算机技术领域,尤其涉及一种应用于Flink SQL的逻辑验证方法和装置。
背景技术
随着大数据技术的发展,涌现出了Storm、Spark、Flink等优秀的大数据计算引擎框架,其中主要使用到Fink,其面向用户的API层,为降低用户使用实时计算门槛,设计了一套符合标准SQL语义的开发语言Flink SQL。
目前并未提供能够与Flink SQL平台结合的开源产品,开发员需将底层技术与产品相结合,以提供给用户使用。Flink开源框架提供两个connector,一个是用于生成数据源表调试数据的组件DataGen,另一个是用于展示目标源表结果的组件Print。在实现本发明的过程中,发明人发现现有技术存在如下问题:
1、DataGen目前不支持维表生成调试数据,限制了业务使用场景;无法将生成的调试数据展示给用户查看,是一个黑盒。虽支持为每个字段特殊化定制,但针对某一类型的字段无法统一配置,不够灵活。
2、Print展示时,无法区分是哪个目标源表中的逻辑验证结果,因为一个任务可能存在多个目标源。
发明内容
有鉴于此,本发明实施例提供一种应用于Flink SQL的逻辑验证方法和装置,至少能够解决现有技术中DataGen组件和Print组件所存在的问题。
为实现上述目的,根据本发明实施例的一个方面,提供了一种应用于Flink SQL的逻辑验证方法,包括:
获取待验证逻辑的SQL文本,对SQL文本中的SQL语句进行分割,得到多条SQL语句;
分析插入SQL语句以获取创建的对象,查找用于创建所述对象的建表DDL语句;其中,对象包括数据源表和/或维表、目标源表;
将建表DDL语句中的外部组件,替换为与所述对象的类型对应的逻辑验证组件,进而基于逻辑验证组件对SQL文本进行逻辑验证。
可选的,所述分析插入SQL语句以获取创建的对象,查找用于创建所述对象的建表DDL语句,包括:
通过第一字符串分析插入SQL语句,以获取目标源表,查找用于创建目标源表的建表DDL语句;
通过第二字符串分析插入SQL语句,以获取数据源表,查找用于创建数据源表的建表DDL语句;和/或
通过第三字符串分析插入SQL语句,以获取维表,查找用于创建维表的建表DDL语句。
可选的,所述分析插入SQL语句以获取创建的对象,查找用于创建所述对象的建表DDL语句,包括:
通过第一字符串遍历插入SQL语句,以获取目标源表并存入目标源表集合;
通过正则匹配方式再次遍历每条SQL语句,得到建表DDL语句,获取建表DDL语句中的表名称;
判断所述目标源表集合中是否存在所述表名称,若存在,则确定为目标源表的建表DDL语句,否则为数据表源或维表的建表DDL语句。
可选的,所述将建表DDL语句中的外部组件,替换为与所述对象的类型对应的逻辑验证组件,包括:
对于目标源表,将建表DDL语句中用于展示目标源表验证结果数据的外部组件,替换为第一逻辑验证组件;
对于数据源表和/或维表,将建表DDL语句中用于生成调试数据的外部组件,替换为第二逻辑验证组件。
可选的,还包括:对于第一逻辑验证组件,引入调试标识符参数,以在验证结果数据的前缀中,添加所述调试标识符参数和相应目标源表的表名称;
展示数据时,利用所述调试标识符参数过滤得到所述验证结果数据,并基于前缀中目标源表的表名称,以日志形式对所述验证结果数据进行分表展示。
可选的,还包括:对于第二逻辑验证组件,引入字符串类型预设长度参数,以根据字符串类型预设长度参数生成相应预设长度的调试数据。
可选的,还包括:引入调试标识符参数,以在所述调试数据的前缀中,添加所述调试标识符参数、相应数据源表或维表的表名称;
展示数据时,利用所述调试标识符参数过滤得到所述调试数据,并基于前缀中数据源表或维表的表名称,以日志形式对所述调试数据进行分表展示。
可选的,还包括:遍历SQL语句,得到创建catalog语句,将所述创建catalog语句中的外部catalog,替换为Flink SQL默认的内存catalog。
可选的,所述对SQL文本中的SQL语句进行分割,包括:
从SQL文本的分隔符声明中确定分隔符,以利用所述分割符对SQL文本中的SQL语句进行分割。
为实现上述目的,根据本发明实施例的另一方面,提供了一种应用于Flink SQL的逻辑验证装置,包括:
分割模块,用于获取待验证逻辑的SQL文本,对SQL文本中的SQL语句进行分割,得到多条SQL语句;
查找模块,用于分析插入SQL语句以获取创建的对象,查找用于创建所述对象的建表DDL语句;其中,对象包括数据源表和/或维表、目标源表;
替换模块,用于将建表DDL语句中的外部组件,替换为与所述对象的类型对应的逻辑验证组件,进而基于逻辑验证组件对SQL文本进行逻辑验证。
可选的,所述查找模块,用于:
通过第一字符串分析插入SQL语句,以获取目标源表,查找用于创建目标源表的建表DDL语句;
通过第二字符串分析插入SQL语句,以获取数据源表,查找用于创建数据源表的建表DDL语句;和/或
通过第三字符串分析插入SQL语句,以获取维表,查找用于创建维表的建表DDL语句。
可选的,所述查找模块,用于:
通过第一字符串遍历插入SQL语句,以获取目标源表并存入目标源表集合;
通过正则匹配方式再次遍历每条SQL语句,得到建表DDL语句,获取建表DDL语句中的表名称;
判断所述目标源表集合中是否存在所述表名称,若存在,则确定为目标源表的建表DDL语句,否则为数据表源或维表的建表DDL语句。
可选的,所述替换模块,用于:
对于目标源表,将建表DDL语句中用于展示目标源表验证结果数据的外部组件,替换为第一逻辑验证组件;
对于数据源表和/或维表,将建表DDL语句中用于生成调试数据的外部组件,替换为第二逻辑验证组件。
可选的,还包括调试标识符参数模块,用于:
对于第一逻辑验证组件,引入调试标识符参数,以在验证结果数据的前缀中,添加所述调试标识符参数和相应目标源表的表名称;
展示数据时,利用所述调试标识符参数过滤得到所述验证结果数据,并基于前缀中目标源表的表名称,以日志形式对所述验证结果数据进行分表展示。
可选的,还包括字符串类型预设长度参数模块,用于:
对于第二逻辑验证组件,引入字符串类型预设长度参数,以根据字符串类型预设长度参数生成相应预设长度的调试数据。
可选的,还包括调试标识符参数,用于:
引入调试标识符参数,以在所述调试数据的前缀中,添加所述调试标识符参数、相应数据源表或维表的表名称;
展示数据时,利用所述调试标识符参数过滤得到所述调试数据,并基于前缀中数据源表或维表的表名称,以日志形式对所述调试数据进行分表展示。
可选的,还包括catalog模块,用于:
遍历SQL语句,得到创建catalog语句,将所述创建catalog语句中的外部catalog,替换为Flink SQL默认的内存catalog。
可选的,所述分割模块,用于:从SQL文本的分隔符声明中确定分隔符,以利用所述分割符对SQL文本中的SQL语句进行分割。
为实现上述目的,根据本发明实施例的再一方面,提供了一种应用于Flink SQL的逻辑验证电子设备。
本发明实施例的电子设备包括:一个或多个处理器;存储装置,用于存储一个或多个程序,当所述一个或多个程序被所述一个或多个处理器执行,使得所述一个或多个处理器实现上述任一所述的应用于Flink SQL的逻辑验证方法。
为实现上述目的,根据本发明实施例的再一方面,提供了一种计算机可读介质,其上存储有计算机程序,所述程序被处理器执行时实现上述任一所述的应用于Flink SQL的逻辑验证方法。
根据本发明所述提供的方案,上述发明中的一个实施例具有如下优点或有益效果:应用于Flink SQL平台,主要解决在如何降低通过不断地与真实上下游生产环境交互调整SQL语句逻辑,以获得最后正确SQL语句开发成本的问题,通过本方案可以快速验证SQL语句逻辑的准确性,在未上线的前提下及时发现问题,缩短业务开发周期,降低开发以及人员成本。
上述的非惯用的可选方式所具有的进一步效果将在下文中结合具体实施方式加以说明。
附图说明
附图用于更好地理解本发明,不构成对本发明的不当限定。其中:
图1是根据本发明实施例的一种应用于Flink SQL的逻辑验证方法的主要流程示意图;
图2是根据本发明实施例的一种可选的应用于Flink SQL的逻辑验证方法的流程示意图;
图3是根据本发明实施例的另一种可选的应用于Flink SQL的逻辑验证方法的流程示意图;
图4是根据本发明实施例的一具体地应用于Flink SQL的逻辑验证方法的流程示意图;
图5是根据本发明实施例的一种应用于Flink SQL的逻辑验证装置的主要模块示意图;
图6是本发明实施例可以应用于其中的示例性系统架构图;
图7是适于用来实现本发明实施例的移动设备或服务器的计算机系统的结构示意图。
具体实施方式
以下结合附图对本发明的示范性实施例做出说明,其中包括本发明实施例的各种细节以助于理解,应当将它们认为仅仅是示范性的。因此,本领域普通技术人员应当认识到,可以对这里描述的实施例做出各种改变和修改,而不会背离本发明的范围和精神。同样,为了清楚和简明,以下的描述中省略了对公知功能和结构的描述。
对于本方案涉及到的词语,做解释如下:
DDL(Data Definition Language,数据定义语言):用来创建或者删除表、视图等。
Flink:Apache下的一个开源的计算引擎,可以处理流任务、批任务,以及支持SQL消费数据处理加工以及持久化到外部存储系统等。
AVRO、JSON、CSV:常见的数据格式类型。
Catalog:数据库中的抽象概念,一个数据库可以有多个catalog,每个catalog下有多个database,每个database下有多张表。
Connector:外部组件,如Mysql、Kafka等,这些组件会继承到Flink引擎,通过使用这些组件可以访问这些外部组件。
在传统的流式计算领域,比如Storm、Spark Streaming都会提供一些Function或者Datastream API,用户通过Java或Scala编写业务逻辑,这种方式虽然灵活,但存在一些不足,比如具备一定门槛且调优较难,随着版本的不断更新,API也出现了许多不兼容的地方。
考虑SQL的通用性和易用性,现有将传统的SQL开发与大数据工具结合,把传统的SQL应用到大数据领域,降低了大数据的使用门槛。同样Flink引擎也提供了Flink SQL语法,Flink SQL是Flink实时计算为简化计算模型,降低用户使用实时计算门槛而设计的一套符合标准SQL语义的开发语言。
目前Spark、Flink都在积极的转向SQL平台,通过本方案提供的Flink SQL平台业务逻辑验证的流程,可以快速验证SQL语句逻辑的准确性,在产品未上线之前能够及时发现问题,缩短业务开发周期,降低开发以及人员成本。
参见图1,示出的是本发明实施例提供的一种应用于Flink SQL的逻辑验证方法的主要流程图,包括如下步骤:
S101:获取待验证逻辑的SQL文本,对SQL文本中的SQL语句进行分割,得到多条SQL语句;
S102:分析插入SQL语句以获取创建的对象,查找用于创建所述对象的建表DDL语句;其中,对象包括数据源表和/或维表、目标源表;
S103:将建表DDL语句中的外部组件,替换为与所述对象的类型对应的逻辑验证组件,进而基于逻辑验证组件对SQL文本进行逻辑验证。
上述实施方式中,对于步骤S101,实际操作中,开源产品通过Flink SQL平台提供给用户使用,因此将调试功能设计到产品这一块以及底层应用这一块的内容中。目前FlinkSQL平台提供有多种Connector,其中常见的有Mysql、Kafka等。
以平台编辑任务为例,每条SQL语句通过分号分割,多条SQL语句则构成了一个任务:
//这个是建表语句,会创建与kafka消息队列的链接,然后读取数据,是一个数据源表
Figure BDA0003298871770000081
Figure BDA0003298871770000091
//这个是建表语句,会创建与kafka消息队列的链接,然后将SQL处理完的数据写到里面去,是一个目标源表
Figure BDA0003298871770000092
//这个是插入的SQL语句,会把数据源表的数据读取后写入目标源表中
INSERT INTO kafkaTableSink SELECT*FROM kafkaTableSource
上述展示的是一个简单的SQL任务,读取kafka数据源表中的数据并写入kafka目标源表中。实际操作中,一个任务也可能存在多个数据源或者目标源,比如基于上述代码再增加SQL语句,以设置多个目标源,具体地:
//再创建一个mysql目标源
Figure BDA0003298871770000101
//同样把上述kafka数据源的数据也写到这个mysql目标源中
INSERT INTO mysqlink SELECT*FROM kafkaTableSource
在添加上述SQL语句后,此时整个任务包含了两个目标源kafka和mysql、以及一个数据源kafka。
将整个任务(SQL文本)按照分隔符进行分割,得到各种类型的SQL语句并存储到SQL集合中,如创建表(create)、查询(select)、插入(insert into)语句等。此处的分隔符可自定义,如在Flink SQL平台的SQL编辑器里的第一行进行分隔符声明,默认为分号,声明用法delimiter符号。
对于步骤S102~S103,遍历SQL集合中的每一条SQL语句,通过正则匹配,查找包含所需查找的对象,即数据源表和/或维表、目标源表。其中,维表(Dimension Table,也称维度表)是对数据进行分析时所用的一个量。
调试功能需从整个SQL文本中,按照分号或者自定义的分隔符分割,得到每一条完整的SQL语句,然后如果发现某条SQL是建表语句,会进行特殊处理。因而,分割SQL语句的目的是为了寻找SQL文本中的建表语句,因为在SQL逻辑准确性验证的过程中,并不能真正的去创建真实外部的表、拉取真实的线上数据,而是将业务方编写的SQL解析,获取数据源、目标源、维表相关的建表DDL语句,将真实关联的Connector替换为用于SQL逻辑验证功能的ApusPrint(即第一逻辑验证组件)和ApusDataGen(即第二逻辑验证组件)。
实施例一,对象为目标源
通过正则匹配(包含了inserrt into\overwrite的关键字处理),查找包含目标源表名的SQL语句。如上述查找到SQL语句“INSERT INTO mysqlink SELECT*FROMkafkaTableSource”,分析得到“mysqlink是一个目标源”,INSERT INTO即为第一字符串。例如:
Figure BDA0003298871770000111
根据插入语句insert into进行分析,得到mysqlink目标源表,查找包括mysqlink的建表DDL语句进行组件替换,将原外部组件WITH内的参数,替换为ApusPrint的参数,如下所示:
Figure BDA0003298871770000121
实施例二,对象为数据源表
数据源表的操作方式与目标源表同理,均通过插入语句“insert into”查找到插入语句,如上述“INSERT INTO kafkaTableSink SELECT*FROM kafkaTableSource”,通过“SELECT*FROM”(即第二字符符串)分析到kafka为数据源表。
查找包括kafka的建表DDL语句,同样进行组件替换,将用于生成调试数据的原外部组件WITH内的参数,替换为第一逻辑验证组件ApusDataGen的参数,ApusDataGen组件支持普通数据源的调试数据的生成,如:
Figure BDA0003298871770000122
实施例三,对象为维表
维表的获取方式区别于数据源表和目标源表,其使用的关键字语法为FORSYSTEM_TIME AS OF(即第三字符串),例如hive维表:
insert into mysqlink
SELECT…FROM kafkaTableSource AS o
JOIN shipu3_test_0922FOR SYSTEM_TIME AS OF o.pro AS dim
ON o.name=dim.customer;
维表的建表语句与数据源、目标源是一样的,因而对于维表,同样会将用于生成调试数据的原外部组件WITH内的参数,替换为自定义的ApusDataGen组件的参数,ApusDataGen组件可以支持维表的调试数据的生成。
需要说明的是,插入SQL语句通常位于建表DDL语句之后,因此第一次遍历SQL语句后,仅能够得到数据源表、维表和目标源表,因此对于建表DDL的查找需二次遍历SQL语句。
实施例四,区别于上述实施例一~实施例三,可视为是一个独立的实施例
遍历SQL集合中的每一条SQL语句,首先通过插入语句“insert into”查找到SQL插入语句,分析SQL插入语句得到目标源表并存入目标源表集合中。同样,也可以建立数据源表集合、维表集合,但由于SQL文本中不是目标源表即为数据源表或维表,因此优选仅创建目标源表集合。
Figure BDA0003298871770000131
再次遍历SQL集合中的每一条SQL语句,设置了大量的正则匹配表达式进行匹配,若匹配到建表DDL语句即create table样式的,则从建表DDL语句中获取位于“createtable”后的表名称,判断该表名称在目标源表集合中是否存在:
1)若存在,说明是目标源表,对建表DDL语句二次加工,将原外部组件WITH内的参数,替换为第一逻辑验证组件ApusPrint的参数。
2)若不存在说明是数据源表或维表,对建表DDL语句二次加工,将原外部组件WITH内的参数,替换为第二逻辑验证组件ApusDataGen的参数。
在执行完上述实施例一、实施例二、实施例三、实施例四后,适配处理完的SQL语句会交由Flink SQL相关接口执行,以利用ApusDataGen组件、ApusPrint组件对建表DDL语句进行逻辑验证,得到验证结果数据。
上述实施例所提供的方法,对DataGen组件进行重构,形成具备支持更丰富功能的ApusDataGen组件,能够支持对数据源、维表的调试数据的生成,丰富了更多的SQL逻辑验证可用的业务场景。另外,对逻辑验证所生成的结果数据进行了缓存,以在任务执行完后通过日志方式打印输出。
参见图2,示出了根据本发明实施例的一种可选的应用于Flink SQL的逻辑验证方法流程示意图,包括如下步骤:
S201:对于第一逻辑验证组件,引入调试标识符参数,以在验证结果数据的前缀中,添加所述调试标识符参数和相应目标源表的表名称;
S202:展示数据时,利用所述调试标识符参数过滤得到所述验证结果数据,并基于前缀中目标源表的表名称,以日志形式对所述验证结果数据进行分表展示;
S203:对于第二逻辑验证组件,引入字符串类型预设长度参数,以根据字符串类型预设长度参数生成相应预设长度的调试数据;
S204:引入调试标识符参数,以在所述调试数据的前缀中,添加所述调试标识符参数、相应数据源表或维表的表名称;
S205:展示数据时,利用所述调试标识符参数过滤得到所述调试数据,并基于前缀中数据源表或维表的表名称,以日志形式对所述调试数据进行分表展示。
上述实施方式中,对于步骤S201~S202、S204~S205,数据源、维表、目标源表相关的数据会输出到日志,由于Flink SQL任务会存在很多的其他日志,为方便从日志提取具体的数据,引入了调试标识符debug-identifier。
例如,对于目标源表:
Figure BDA0003298871770000151
对于数据源表或维表:
Figure BDA0003298871770000152
无论是数据源、维表还是目标源,输出的每一条数据除了包含debug-identifier参数配置的关键字外,还增加了表名字的输出,用于区分表数据,方便后续从日志采集服务中截取数据并分表展示。其格式如下所示(此处仅为示例):
INFO xxxxx
INFO xxxxx
INFO调试标识符数据源表1(具体调试数据)
INFO xxxxx
INFO调试标识符维表2(具体调试数据)
INFO调试标识符目标源表3(具体验证结果数据)
INFO xxxxx
为将生成的调试数据展示给用户查看,同样对原生DataGen组件进行了功能扩展,将生成的调试数据通过日志方式展示。后续在进行数据展示时,首先利用“debug-identifier调试标识符”过滤得到调试数据,之后基于前缀中的数据源表表名或维表表名,以日志形式对调试数据进行分表展示。
同样,将原Print组件改造升级为ApusPrint组件,由原来的标准输出改为日志打印目标源验证结果数据的方式,同时增加表名关键字,以区分数据所属的表,与数据源表输出数据格式保持一致,方便产品端统一方式采集数据、分表展示。具体地,首先利用“debug-identifier调试标识符”过滤得到验证结果数据,之后基于前缀中的目标源表表名,以日志形式对验证结果数据进行分表展示。
日志服务根据配置的debug-identifier参数的值,在任务日志中检索关键字,得到每一条完整的数据日志,然后根据表名拆分,以分别缓存每个表的数据。
对于步骤S203,现有虽支持为每个字段特殊化定制,但是针对某一类型的字段无法统一配置,不够灵活。假设数据源表存在100个字符串类型字段,目前需要针对这100个字符串类型字段分别单独进行设置,比较繁琐。
针对该问题,引入stringtype-default-length字符串类型预设长度参数,以控制表字段是字符串类型的数据生成的预设长度。
例如前述
name string,
age int,
sex string,
address string,
name、sex和address均为字符串类型,假设针对该类型的预设长度为10,则会自动生成长度为10的字符串,如abcedfea12。age为数字类型,则会生成长度为10的数字,不足位置可以补0。
通过该方式,无需针对每个字段进行配置,且可以针对同类型字符串进行统一配置,整体仅配置一次即可;该长度可以预设,在未预设的情况下自动使用默认长度,具备灵活性和可变更性。
根据上述描述,数据源、维表、目标源表实现了将生成的调试数据或者验证结果数据,通过日志文件方式落盘存储;另外也对数据源、维表使用的ApusDataGen组件优化,引入debug-identifier参数,用来自定义配置关键字,方便日志服务检索表数据相关的日志数据。
也在ApusDataGen以及ApusPrint组件的数据输出引入了表名字关键字标识,日志服务可以从混乱的任务日志文件中解析获取每张表的数据,方便产品端分表展示结果;引入stringtype-default-length参数,在字符串类型较多情况下,可用统一设置字符串类型字段的生成数据默认长度,更加灵活方便。
上述实施例所提供的方法,针对调试数据无法显示问题,设置有debug-identifier;针对数据无法区分显示问题,在其前缀中设置表名称进行区分;引入stringtype-default-length,以处理字段无法统一配置问题,实现配置灵活性和可变更性。
参见图3,示出了根据本发明实施例的另一种可选的应用于Flink SQL的逻辑验证方法流程示意图,包括如下步骤:
S301:获取待验证逻辑的SQL文本,对SQL文本中的SQL语句进行分割,得到多条SQL语句;
S302:遍历SQL语句,得到创建catalog语句,将所述创建catalog语句中的外部catalog,替换为Flink SQL默认的内存catalog;
S303:分析插入SQL语句以获取创建的对象,查找用于创建所述对象的建表DDL语句;其中,对象包括数据源表和/或维表、目标源表;
S304:将建表DDL语句中的外部组件,替换为与所述对象的类型对应的逻辑验证组件,进而基于逻辑验证组件对SQL文本进行逻辑验证。
上述实施方式中,对于步骤S301、S303和S304,可参见图1所示步骤S101~S103的描述,在此不再赘述。
上述实施方式中,对于步骤S302,目前Flink SQL支持的catalog包含了hivecatalog、xxbc catgalog和generic_in_memory catalog(默认)。在引入外部catalog情况下,例如hive catalog,逻辑验证过程中如果通过hive metastore去真正创建目标源或者数据源表,那么hive中会引入不必要的脏表。
为了减少脏表的引入,针对使用外部catalog的Flink SQL场景,可以将创建外部的catalog类型映射为Flink默认的catalog类型,之后创建该catalog的表都会基于内存来创建。但如果是其他语句例如UDF的创建、Insert into语句等不再处理直接执行即可。例如,
Figure BDA0003298871770000181
替换为
Figure BDA0003298871770000182
上述实施例所提供的方法,针对使用外部catalog的Flink SQL场景,可以将外部catalog映射为Flink默认的内存catalog,之后创建该catalog的表都会基于内存来创建,以降低产生脏表现象。
参见图4,示出了根据本发明实施例的一具体地应用于Flink SQL的逻辑验证方法框架示意图,包括:
Flink SQL业务开发:业务方进行SQL业务的开发,编写符合Flink SQL语法的SQL语句;
SQL解析服务:解析业务方编写的业务SQL,把每一条SQL在解析服务中适配,例如将目标源表的建表DDL语句更换为ApusPrint组件、数据源表和/或维表的建表DDL语句更换为ApusDataGen组件、Catalog语句映射为基于内存Catalog语句;
FlinSQL引擎执行:适配完以后,将SQL语句提交给Flink SQL引擎相关的接口执行,ApusDataGen和ApusPrint组件将通过日志方式,输出数据源表、维表、目标源表的相关数据;
纠错:如果编写的SQL存在错误,那么Flink SQL引擎执行时候会将错误的原因通过日志展示,方便业务方根据具体原因修改SQL语句,再次验证;
日志采集:根据关键字匹配输出结果数据的记录,搜集表数据,每个表汇总自己的数据;
产品展示:分表展示结果数据,方便查看结果,校验SQL结果的逻辑的准确性。
本发明实施例所提供的方法,Flink SQL平台支持SQL逻辑验证功能,方便快速完成SQL逻辑准确性的验证,提前发现问题,缩短开发周期。所具有的有益效果具体如下:
1、现有不支持对维表的逻辑验证,本方案通过对原生DataGen组件进行了底层代码的改造,使其既可以支持数据源表生成调试数据,也可以支持维表生成调试数据。新组件ApusDataGen可以屏蔽业务真实数据的格式(JSON、AVRO、CSV等),具备更好的兼容性;还可以根据建表DDL语句中每个字段配置的Flink SQL内部类型,生成相应的调试数据。
2、为展示生成的调试数据,同样对原生DataGen组件进行了功能扩展,将调试数据以日志方式展示,同时自定义输出调试数据的前缀,便于后续从日志中截取生成的调试数据。
3、对目标源表结果展示功能的Print组件也进行改造,创建ApusPrint组件,底层实现以日志方式展示验证结果数据,同时增加了表名关键字的输出,在存在多个目标源表的情况下,方便FlinkSQL平台将SQL逻辑验证的结果数据分表展示给业务方核对结果。
参见图5,示出了本发明实施例提供的一种应用于Flink SQL的逻辑验证装置500的主要模块示意图,包括:
分割模块501,用于获取待验证逻辑的SQL文本,对SQL文本中的SQL语句进行分割,得到多条SQL语句;
查找模块502,用于分析插入SQL语句以获取创建的对象,查找用于创建所述对象的建表DDL语句;其中,对象包括数据源表和/或维表、目标源表;
替换模块503,用于将建表DDL语句中的外部组件,替换为与所述对象的类型对应的逻辑验证组件,进而基于逻辑验证组件对SQL文本进行逻辑验证。
本发明实施装置中,所述查找模块502,用于:
通过第一字符串分析插入SQL语句,以获取目标源表,查找用于创建目标源表的建表DDL语句;
通过第二字符串分析插入SQL语句,以获取数据源表,查找用于创建数据源表的建表DDL语句;和/或
通过第三字符串分析插入SQL语句,以获取维表,查找用于创建维表的建表DDL语句。
本发明实施装置中,所述查找模块502,用于:
通过第一字符串遍历插入SQL语句,以获取目标源表并存入目标源表集合;
通过正则匹配方式再次遍历每条SQL语句,得到建表DDL语句,获取建表DDL语句中的表名称;
判断所述目标源表集合中是否存在所述表名称,若存在,则确定为目标源表的建表DDL语句,否则为数据表源或维表的建表DDL语句。
本发明实施装置中,所述替换模块503,用于:
对于目标源表,将建表DDL语句中用于展示目标源表验证结果数据的外部组件,替换为第一逻辑验证组件;
对于数据源表和/或维表,将建表DDL语句中用于生成调试数据的外部组件,替换为第二逻辑验证组件。
本发明实施装置还包括调试标识符参数模块,用于:
对于第一逻辑验证组件,引入调试标识符参数,以在验证结果数据的前缀中,添加所述调试标识符参数和相应目标源表的表名称;
展示数据时,利用所述调试标识符参数过滤得到所述验证结果数据,并基于前缀中目标源表的表名称,以日志形式对所述验证结果数据进行分表展示。
本发明实施装置还包括字符串类型预设长度参数模块,用于:
对于第二逻辑验证组件,引入字符串类型预设长度参数,以根据字符串类型预设长度参数生成相应预设长度的调试数据。
本发明实施装置还包括调试标识符参数,用于:
引入调试标识符参数,以在所述调试数据的前缀中,添加所述调试标识符参数、相应数据源表或维表的表名称;
展示数据时,利用所述调试标识符参数过滤得到所述调试数据,并基于前缀中数据源表或维表的表名称,以日志形式对所述调试数据进行分表展示。
本发明实施装置还包括catalog模块,用于:
遍历SQL语句,得到创建catalog语句,将所述创建catalog语句中的外部catalog,替换为Flink SQL默认的内存catalog。
本发明实施装置中,所述分割模块501,用于:
从SQL文本的分隔符声明中确定分隔符,以利用所述分割符对SQL文本中的SQL语句进行分割。
另外,在本发明实施例中所述装置的具体实施内容,在上面所述方法中已经详细说明了,故在此重复内容不再说明。
图6示出了可以应用本发明实施例的示例性系统架构600,包括终端设备601、602、603,网络604和服务器605(仅仅是示例)。
终端设备601、602、603可以是具有显示屏并且支持网页浏览的各种电子设备,安装有各种通讯客户端应用,用户可以使用终端设备601、602、603通过网络604与服务器605交互,以接收或发送消息等。
网络604用以在终端设备601、602、603和服务器605之间提供通信链路的介质。网络604可以包括各种连接类型,例如有线、无线通信链路或者光纤电缆等等。
服务器605可以是提供各种服务的服务器,用于执行编写SQL文本,拆解SQL语句,分析目标源表、数据源表、维表,替换组件并进行逻辑验证操作。
需要说明的是,本发明实施例所提供的方法一般由服务器605执行,相应地,装置一般设置于服务器605中。
应该理解,图6中的终端设备、网络和服务器的数目仅仅是示意性的。根据实现需要,可以具有任意数目的终端设备、网络和服务器。
下面参考图7,其示出了适于用来实现本发明实施例的终端设备的计算机系统700的结构示意图。图7示出的终端设备仅仅是一个示例,不应对本发明实施例的功能和使用范围带来任何限制。
如图7所示,计算机系统700包括中央处理单元(CPU)701,其可以根据存储在只读存储器(ROM)702中的程序或者从存储部分708加载到随机访问存储器(RAM)703中的程序而执行各种适当的动作和处理。在RAM 703中,还存储有系统700操作所需的各种程序和数据。CPU 701、ROM 702以及RAM 703通过总线704彼此相连。输入/输出(I/O)接口705也连接至总线704。
以下部件连接至I/O接口705:包括键盘、鼠标等的输入部分706;包括诸如阴极射线管(CRT)、液晶显示器(LCD)等以及扬声器等的输出部分707;包括硬盘等的存储部分708;以及包括诸如LAN卡、调制解调器等的网络接口卡的通信部分709。通信部分709经由诸如因特网的网络执行通信处理。驱动器710也根据需要连接至I/O接口705。可拆卸介质711,诸如磁盘、光盘、磁光盘、半导体存储器等等,根据需要安装在驱动器710上,以便于从其上读出的计算机程序根据需要被安装入存储部分708。
特别地,根据本发明公开的实施例,上文参考流程图描述的过程可以被实现为计算机软件程序。例如,本发明公开的实施例包括一种计算机程序产品,其包括承载在计算机可读介质上的计算机程序,该计算机程序包含用于执行流程图所示的方法的程序代码。在这样的实施例中,该计算机程序可以通过通信部分709从网络上被下载和安装,和/或从可拆卸介质711被安装。在该计算机程序被中央处理单元(CPU)701执行时,执行本发明的系统中限定的上述功能。
需要说明的是,本发明所示的计算机可读介质可以是计算机可读信号介质或者计算机可读存储介质或者是上述两者的任意组合。计算机可读存储介质例如可以是——但不限于——电、磁、光、电磁、红外线、或半导体的系统、装置或器件,或者任意以上的组合。计算机可读存储介质的更具体的例子可以包括但不限于:具有一个或多个导线的电连接、便携式计算机磁盘、硬盘、随机访问存储器(RAM)、只读存储器(ROM)、可擦式可编程只读存储器(EPROM或闪存)、光纤、便携式紧凑磁盘只读存储器(CD-ROM)、光存储器件、磁存储器件、或者上述的任意合适的组合。在本发明中,计算机可读存储介质可以是任何包含或存储程序的有形介质,该程序可以被指令执行系统、装置或者器件使用或者与其结合使用。而在本发明中,计算机可读的信号介质可以包括在基带中或者作为载波一部分传播的数据信号,其中承载了计算机可读的程序代码。这种传播的数据信号可以采用多种形式,包括但不限于电磁信号、光信号或上述的任意合适的组合。计算机可读的信号介质还可以是计算机可读存储介质以外的任何计算机可读介质,该计算机可读介质可以发送、传播或者传输用于由指令执行系统、装置或者器件使用或者与其结合使用的程序。计算机可读介质上包含的程序代码可以用任何适当的介质传输,包括但不限于:无线、电线、光缆、RF等等,或者上述的任意合适的组合。
附图中的流程图和框图,图示了按照本发明各种实施例的系统、方法和计算机程序产品的可能实现的体系架构、功能和操作。在这点上,流程图或框图中的每个方框可以代表一个模块、程序段、或代码的一部分,上述模块、程序段、或代码的一部分包含一个或多个用于实现规定的逻辑功能的可执行指令。也应当注意,在有些作为替换的实现中,方框中所标注的功能也可以以不同于附图中所标注的顺序发生。例如,两个接连地表示的方框实际上可以基本并行地执行,它们有时也可以按相反的顺序执行,这依所涉及的功能而定。也要注意的是,框图或流程图中的每个方框、以及框图或流程图中的方框的组合,可以用执行规定的功能或操作的专用的基于硬件的系统来实现,或者可以用专用硬件与计算机指令的组合来实现。
描述于本发明实施例中所涉及到的模块可以通过软件的方式实现,也可以通过硬件的方式来实现。所描述的模块也可以设置在处理器中,例如,可以描述为:一种处理器包括分割模块、查找模块、替换模块。其中,这些模块的名称在某种情况下并不构成对该模块本身的限定,例如,替换模块还可以被描述为“替换组件和逻辑验证模块”。
作为另一方面,本发明还提供了一种计算机可读介质,该计算机可读介质可以是上述实施例中描述的设备中所包含的;也可以是单独存在,而未装配入该设备中。上述计算机可读介质承载有一个或者多个程序,当上述一个或者多个程序被一个该设备执行时,使得该设备包括:
获取待验证逻辑的SQL文本,对SQL文本中的SQL语句进行分割,得到多条SQL语句;
分析插入SQL语句以获取创建的对象,查找用于创建所述对象的建表DDL语句;其中,对象包括数据源表和/或维表、目标源表;
将建表DDL语句中的外部组件,替换为与所述对象的类型对应的逻辑验证组件,进而基于逻辑验证组件对SQL文本进行逻辑验证。
根据本发明实施例的技术方案,对DataGen组件进行重构,形成可支持更丰富功能的ApusDataGen组件,能够支持对数据源、维表的调试数据的生成,丰富了更多的SQL逻辑验证可用的业务场景;针对调试数据无法显示问题,设置debug-identifier,针对数据无法区分显示问题,在其前缀中设置表名称进行区分;引入stringtype-default-length,以处理字段无法统一配置问题,实现配置灵活性和可变更性。
上述具体实施方式,并不构成对本发明保护范围的限制。本领域技术人员应该明白的是,取决于设计要求和其他因素,可以发生各种各样的修改、组合、子组合和替代。任何在本发明的精神和原则之内所作的修改、等同替换和改进等,均应包含在本发明保护范围之内。

Claims (12)

1.一种应用于Flink SQL的逻辑验证方法,其特征在于,包括:
获取待验证逻辑的SQL文本,对SQL文本中的SQL语句进行分割,得到多条SQL语句;
分析插入SQL语句以获取创建的对象,查找用于创建所述对象的建表DDL语句;其中,对象包括数据源表和/或维表、目标源表;
将建表DDL语句中的外部组件,替换为与所述对象的类型对应的逻辑验证组件,进而基于逻辑验证组件对SQL文本进行逻辑验证。
2.根据权利要求1所述的方法,其特征在于,所述分析插入SQL语句以获取创建的对象,查找用于创建所述对象的建表DDL语句,包括:
通过第一字符串分析插入SQL语句,以获取目标源表,查找用于创建目标源表的建表DDL语句;
通过第二字符串分析插入SQL语句,以获取数据源表,查找用于创建数据源表的建表DDL语句;和/或
通过第三字符串分析插入SQL语句,以获取维表,查找用于创建维表的建表DDL语句。
3.根据权利要求1所述的方法,其特征在于,所述分析插入SQL语句以获取创建的对象,查找用于创建所述对象的建表DDL语句,包括:
通过第一字符串遍历插入SQL语句,以获取目标源表并存入目标源表集合;
通过正则匹配方式再次遍历每条SQL语句,得到建表DDL语句,获取建表DDL语句中的表名称;
判断所述目标源表集合中是否存在所述表名称,若存在,则确定为目标源表的建表DDL语句,否则为数据表源或维表的建表DDL语句。
4.根据权利要求1-3中任一项所述的方法,其特征在于,所述将建表DDL语句中的外部组件,替换为与所述对象的类型对应的逻辑验证组件,包括:
对于目标源表,将建表DDL语句中用于展示目标源表验证结果数据的外部组件,替换为第一逻辑验证组件;
对于数据源表和/或维表,将建表DDL语句中用于生成调试数据的外部组件,替换为第二逻辑验证组件。
5.根据权利要求4所述的方法,其特征在于,还包括:
对于第一逻辑验证组件,引入调试标识符参数,以在验证结果数据的前缀中,添加所述调试标识符参数和相应目标源表的表名称;
展示数据时,利用所述调试标识符参数过滤得到所述验证结果数据,并基于前缀中目标源表的表名称,以日志形式对所述验证结果数据进行分表展示。
6.根据权利要求4所述的方法,其特征在于,还包括:
对于第二逻辑验证组件,引入字符串类型预设长度参数,以根据字符串类型预设长度参数生成相应预设长度的调试数据。
7.根据权利要求6所述的方法,其特征在于,还包括:
引入调试标识符参数,以在所述调试数据的前缀中,添加所述调试标识符参数、相应数据源表或维表的表名称;
展示数据时,利用所述调试标识符参数过滤得到所述调试数据,并基于前缀中数据源表或维表的表名称,以日志形式对所述调试数据进行分表展示。
8.根据权利要求1所述的方法,其特征在于,还包括:
遍历SQL语句,得到创建catalog语句,将所述创建catalog语句中的外部catalog,替换为Flink SQL默认的内存catalog。
9.根据权利要求1所述的方法,其特征在于,所述对SQL文本中的SQL语句进行分割,包括:
从SQL文本的分隔符声明中确定分隔符,以利用所述分割符对SQL文本中的SQL语句进行分割。
10.一种应用于Flink SQL的逻辑验证装置,其特征在于,包括:
分割模块,用于获取待验证逻辑的SQL文本,对SQL文本中的SQL语句进行分割,得到多条SQL语句;
查找模块,用于分析插入SQL语句以获取创建的对象,查找用于创建所述对象的建表DDL语句;其中,对象包括数据源表和/或维表、目标源表;
替换模块,用于将建表DDL语句中的外部组件,替换为与所述对象的类型对应的逻辑验证组件,进而基于逻辑验证组件对SQL文本进行逻辑验证。
11.一种电子设备,其特征在于,包括:
一个或多个处理器;
存储装置,用于存储一个或多个程序,
当所述一个或多个程序被所述一个或多个处理器执行,使得所述一个或多个处理器实现如权利要求1-9中任一所述的方法。
12.一种计算机可读介质,其上存储有计算机程序,其特征在于,所述程序被处理器执行时实现如权利要求1-9中任一所述的方法。
CN202111185132.2A 2021-10-12 2021-10-12 一种应用于Flink SQL的逻辑验证方法和装置 Pending CN113900944A (zh)

Priority Applications (1)

Application Number Priority Date Filing Date Title
CN202111185132.2A CN113900944A (zh) 2021-10-12 2021-10-12 一种应用于Flink SQL的逻辑验证方法和装置

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CN202111185132.2A CN113900944A (zh) 2021-10-12 2021-10-12 一种应用于Flink SQL的逻辑验证方法和装置

Publications (1)

Publication Number Publication Date
CN113900944A true CN113900944A (zh) 2022-01-07

Family

ID=79191419

Family Applications (1)

Application Number Title Priority Date Filing Date
CN202111185132.2A Pending CN113900944A (zh) 2021-10-12 2021-10-12 一种应用于Flink SQL的逻辑验证方法和装置

Country Status (1)

Country Link
CN (1) CN113900944A (zh)

Cited By (2)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN115237936A (zh) * 2022-09-14 2022-10-25 北京海致星图科技有限公司 检测sql语句中字段的方法、装置、存储介质和设备
CN115470229A (zh) * 2022-08-30 2022-12-13 昆仑数智科技有限责任公司 数据表处理方法、装置、电子设备及存储介质

Cited By (3)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN115470229A (zh) * 2022-08-30 2022-12-13 昆仑数智科技有限责任公司 数据表处理方法、装置、电子设备及存储介质
CN115237936A (zh) * 2022-09-14 2022-10-25 北京海致星图科技有限公司 检测sql语句中字段的方法、装置、存储介质和设备
CN115237936B (zh) * 2022-09-14 2024-04-05 北京海致星图科技有限公司 检测sql语句中字段的方法、装置、存储介质和设备

Similar Documents

Publication Publication Date Title
CN109933752B (zh) 一种导出电子文档的方法和装置
CN109522341B (zh) 实现基于sql的流式数据处理引擎的方法、装置、设备
CN113900944A (zh) 一种应用于Flink SQL的逻辑验证方法和装置
CN110555030A (zh) 一种sql语句的处理方法和装置
CN111125064B (zh) 一种生成数据库模式定义语句的方法和装置
CN113419789A (zh) 数据模型脚本的生成方法和装置
CN111078729A (zh) 医疗数据溯源方法、装置、系统、存储介质以及电子设备
CN112948726A (zh) 一种处理异常信息的方法、装置和系统
CN114091426A (zh) 一种处理数据仓库中字段数据的方法和装置
CN112988583A (zh) 数据库语法兼容性测试的方法和装置
CN108694172B (zh) 信息输出方法和装置
CN113419740A (zh) 程序数据流的分析方法、装置、电子设备及可读存储介质
CN113468196A (zh) 用于处理数据的方法、装置、系统、服务器和介质
CN113220710A (zh) 数据查询方法、装置、电子设备以及存储介质
CN116361522A (zh) 一种数据的展示方法和装置
CN112579151A (zh) 一种模型文件的生成方法和装置
CN111310434B (zh) 文本生成方法和装置、电子设备和存储介质
CN114661747A (zh) 指标计算方法、装置、存储介质及计算机设备
CN113742321A (zh) 一种数据更新的方法和装置
CN111221846B (zh) 一种sql语句的自动翻译方法及装置
CN115545006B (zh) 规则脚本生成方法、装置、计算机设备及介质
CN115904487B (zh) 一种分析型数据口径管理方法、系统、设备及存储介质
CN111177183B (zh) 一种生成数据库访问语句的方法和装置
CN116610706A (zh) 一种数据血缘分析方法、服务器和系统
CN113760945A (zh) 一种审核sql语句的方法及装置

Legal Events

Date Code Title Description
PB01 Publication
PB01 Publication
SE01 Entry into force of request for substantive examination
SE01 Entry into force of request for substantive examination