一种Clickhouse数据库虚拟列查询方法和装置与流程

文档序号:31780452发布日期:2022-10-12 09:59阅读:209来源:国知局
一种clickhouse数据库虚拟列查询方法和装置
技术领域
:1.本技术涉及数据库领域,尤指一种clickhouse数据库虚拟列查询方法和装置。
背景技术
::2.在软件项目的开发实施和定制过程中,为数据库表增加列定义,以存储新的数据是一种频繁出现的需求,但是数据库表结构定义频繁修改会带来其它方面的困难和额外工作量。clickhouse数据库通过json函数从存储json数据的列查询jsonkey相关数据,部分解决了上述需求。但是为了实现虚拟列查询,clickhousesql必须使用正确的json函数、从正确的json列抽取数据,sql语句会相当复杂且不便于阅读和修改。技术实现要素:3.本技术提供了一种clickhouse数据库虚拟列查询方法和装置,可以基于标准的sql查询语句访问clickhouse数据库中的虚拟列数据。4.本技术提供了一种clickhouse数据库虚拟列查询方法,方法包括:5.获取clickhouse数据库配置文件中包含的虚拟列信息;6.当收到用户输入的sql查询语句后,如果根据虚拟列信息确定所述sql查询语句中的查询对象包含虚拟列,则根据预先设置的转换规则和所述虚拟列信息将所述sql查询语句转换为clickhousejson函数调用序列。7.一种示例性的实施例中,所述获取clickhouse数据库配置文件中包含的虚拟列信息,包括:8.获取clickhouse数据库配置文件的数据表结构和真实列信息;9.根据所获取的数据表结构、将虚拟列信息添加存储到所对应的真实列名相对应的数据表列中;10.确定clickhouse数据库中虚拟列信息,其中,所述虚拟列信息包括:所在数据库中数据表的名称、虚拟列的名称、数据类型和json列名。11.一种示例性的实施例中,所述真实列信息包括:列标识、类型、长度。12.一种示例性的实施例中,所述根据预先设置的转换规则和所述虚拟列信息将所述sql语句转换为clickhousejson函数调用序列,包括:13.将所述sql查询语句解析为抽象语法树;14.遍历抽象语法树,根据所述语法树中的上下文信息确定是否存在虚拟列;15.若存在虚拟列时,则根据预先设置的虚拟列和json函数之间的对应关系,得到作为查询对象的虚拟列对应的json函数;16.使用该虚拟列对应的json函数替代sql查询语句中的虚拟列,得到json函数调用序列。17.一种示例性的实施例中,方法还包括:18.将所述clickhousejson函数调用序列输出为该输入的查询虚拟列的sql语句转换后的sql语句;19.并利用转换后的sql语句查询clickhouse数据库配置文件的真实列数据和虚拟列数据。20.本技术还提供了一种clickhouse数据库虚拟列查询的装置,包括:存储器和处理器;所述存储器,用于保存用于clickhouse数据库虚拟列查询的程序;21.所述处理器,用于读取执行所述用于clickhouse数据库虚拟列查询的程序,执行如下操作:22.获取clickhouse数据库配置文件中包含的虚拟列信息;23.当收到用户输入的sql查询语句后,如果根据虚拟列信息确定所述sql查询语句中的查询对象包含虚拟列,则根据预先设置的转换规则和所述虚拟列信息将所述sql查询语句转换为clickhousejson函数调用序列。24.一种示例性的实施例中,所述获取clickhouse数据库配置文件中包含的虚拟列信息,包括:25.获取clickhouse数据库配置文件的数据表结构和真实列信息;26.根据所获取的数据表结构、将虚拟列信息添加存储到所对应的真实列名相对应的数据表列中;27.确定clickhouse数据库中虚拟列信息,其中,所述虚拟列信息包括:所在数据库中数据表的名称、虚拟列的名称、数据类型和json列名。28.一种示例性的实施例中,所述真实列信息包括:列标识、类型、长度。29.一种示例性的实施例中,所述根据预先设置的转换规则和所述虚拟列信息将所述sql语句转换为clickhousejson函数调用序列,包括:30.将所述sql查询语句解析为抽象语法树;31.遍历抽象语法树,根据所述语法树中的上下文信息确定是否存在虚拟列;32.若存在虚拟列时,则根据预先设置的虚拟列和json函数之间的对应关系,得到作为查询对象的虚拟列对应的json函数;33.使用该虚拟列对应的json函数替代sql查询语句中的虚拟列,得到json函数调用序列。34.一种示例性的实施例中,所述存储器还用于:35.将所述clickhousejson函数调用序列输出为该输入的查询虚拟列的sql语句转换后的sql语句;36.并利用转换后的sql语句查询clickhouse数据库配置文件的真实列数据和虚拟列数据。37.与相关技术相比,本技术提供一种clickhouse数据库虚拟列查询方法和装置,方法包括:获取clickhouse数据库配置文件中包含的虚拟列信息;当收到用户输入的sql查询语句后,如果根据虚拟列信息确定所述sql查询语句中的查询对象包含虚拟列,则根据预先设置的转换规则和所述虚拟列信息将所述sql查询语句转换为clickhousejson函数调用序列。本技术可以基于对通用的sql查询语句的转换,以实现对clickhouse数据库虚拟列的查询。38.本技术的其它特征和优点将在随后的说明书中阐述,并且,部分地从说明书中变得显而易见,或者通过实施本技术而了解。本技术的其他优点可通过在说明书以及附图中所描述的方案来实现和获得。附图说明39.附图用来提供对本技术技术方案的理解,并且构成说明书的一部分,与本技术的实施例一起用于解释本技术的技术方案,并不构成对本技术技术方案的限制。40.图1为本技术实施例的clickhouse数据库虚拟列查询的方法流程图;41.图2为一示例实施例的clickhouse数据库虚拟列查询的方法流程图;42.图3为本技术实施例的clickhouse数据库虚拟列查询装置示意图。具体实施方式43.本技术描述了多个实施例,但是该描述是示例性的,而不是限制性的,并且对于本领域的普通技术人员来说显而易见的是,在本技术所描述的实施例包含的范围内可以有更多的实施例和实现方案。尽管在附图中示出了许多可能的特征组合,并在具体实施方式中进行了讨论,但是所公开的特征的许多其它组合方式也是可能的。除非特意加以限制的情况以外,任何实施例的任何特征或元件可以与任何其它实施例中的任何其他特征或元件结合使用,或可以替代任何其它实施例中的任何其他特征或元件。44.本技术包括并设想了与本领域普通技术人员已知的特征和元件的组合。本技术已经公开的实施例、特征和元件也可以与任何常规特征或元件组合,以形成由权利要求限定的独特的发明方案。任何实施例的任何特征或元件也可以与来自其它发明方案的特征或元件组合,以形成另一个由权利要求限定的独特的发明方案。因此,应当理解,在本技术中示出和/或讨论的任何特征可以单独地或以任何适当的组合来实现。因此,除了根据所附权利要求及其等同替换所做的限制以外,实施例不受其它限制。此外,可以在所附权利要求的保护范围内进行各种修改和改变。45.此外,在描述具有代表性的实施例时,说明书可能已经将方法和/或过程呈现为特定的步骤序列。然而,在该方法或过程不依赖于本文所述步骤的特定顺序的程度上,该方法或过程不应限于所述的特定顺序的步骤。如本领域普通技术人员将理解的,其它的步骤顺序也是可能的。因此,说明书中阐述的步骤的特定顺序不应被解释为对权利要求的限制。此外,针对该方法和/或过程的权利要求不应限于按照所写顺序执行它们的步骤,本领域技术人员可以容易地理解,这些顺序可以变化,并且仍然保持在本技术实施例的精神和范围内。46.一些技术中,clickhouse数据库通过json函数从存储json数据的列查询jsonkey相关数据,该查询的过程,例如:47.设有clickhouse表test定义了json字符串存储列text,可以使用json函数从text列(后续简称为json列)中抽取jsonkey定义的虚拟列:48.createtabletest(49.idstring,50.textstring)51.engine=mergetree52.primarykey(id)53.clickhouse数据表test有两个真实列id,text。列text中保存有json格式数据如:{"status":200,"message":"responsemessage","finished":true}。54.使用json函数抽取虚拟列查询示例如下:55.select56.id,57.jsonextractint(text,'status')asstatus,58.jsonextractbool(text,'finished')asfinished,59.jsonextractstring(text,'message')message60.fromtest61.where62.status=200andmessage《》”63.上述实现了对3个虚拟列status/finished/message的动态查询。从上述查询的内容可知,为实现虚拟列查询,clickhousesql必须使用正确的json函数从正确的json列抽取数据。在上述示例中,clickhousesql必须使用正确的json函数从正确的json列抽取数据,sql语句会相当复杂且不便于阅读和修改。64.发明人针对上述所存在的问题,提出一种采用普通的sql语句查询clickhouse数据库虚拟列查询的方法。65.本公开实施例提供了一种clickhouse数据库虚拟列查询方法,如图1所示,方法包括步骤s100-s120,66.s100.获取clickhouse数据库配置文件中包含的虚拟列信息;67.s110.当收到用户输入的sql查询语句后,如果根据虚拟列信息确定所述sql查询语句中的查询对象包含虚拟列,则根据预先设置的转换规则和所述虚拟列信息将所述sql查询语句转换为clickhousejson函数调用序列。68.在本实施例中,该sql查询语句可以是通用的查询语句,对于该语句的编写格式没有具体的限定;例如:selectid,status,finished,messagefromtestwherestatus=200andmessage《》”。69.一种示例性的实施例中,所述获取clickhouse数据库配置文件中包含的虚拟列信息,包括:70.获取clickhouse数据库配置文件的数据表结构和真实列信息;71.根据所获取的数据表结构、将虚拟列信息添加存储到所对应的真实列名相对应的数据表列中;确定clickhouse数据库中虚拟列信息,其中,所述虚拟列信息包括:所在数据库中数据表的名称、虚拟列的名称、数据类型和json列名。所述真实列信息包括:列标识、类型、长度。72.在本实施例中,该表格在查询列信息运行时在内存中存在,并不是一个真实的数据库表格。下面举一个例子,包括真实列和虚拟列信息的数据库表,即存在于程序的内存中、融合真实列和虚拟列信息的概念表格,如下:[0073][0074]一种示例性的实施例中,所述根据预先设置的转换规则和所述虚拟列信息将所述sql语句转换为clickhousejson函数调用序列,包括:[0075]将所述sql查询语句解析为抽象语法树;[0076]遍历抽象语法树,根据所述语法树中的上下文信息确定是否存在虚拟列;[0077]若存在虚拟列时,则根据预先设置的虚拟列和json函数之间的对应关系,得到作为查询对象的虚拟列对应的json函数;[0078]使用该虚拟列对应的json函数替代sql查询语句中的虚拟列,得到json函数调用序列。[0079]一种示例性的实施例中,将所述clickhousejson函数调用序列输出为该输入的查询虚拟列的sql语句(原始的查询虚拟列的sql语句)转换后的sql语句;[0080]并利用转换后的sql语句查询clickhouse数据库中的真实列数据和虚拟列数据。[0081]本实施例中允许最终用户或开发者使用标准的clickhousesql语法,以自然的方式查询虚拟列和真实列,将虚拟列假定为在clickhouse表结构中真实存在一样处理,这为sql语句的阅读、维护提供了极大便利。同时由于该虚拟列定义只在配置文件数据中存在,更加方便修改,这样也提升了软件定制能力。[0082]示例一[0083]采用clickhouse数据库虚拟列查询方法,查询虚拟列过程如下:[0084]第一步、开发人员通过配置文件定义虚拟列信息;[0085]虚拟列信息包括:所在数据库中数据表的名称、虚拟列的名称、数据类型和json列名;[0086]第二步、获取clickhouse数据库配置文件中包含的虚拟列信息;[0087]在查询启动过程中,该软件组件可以通过读取clickhouse数据库配置文件中的虚拟列信息,读取clickhouse数据库的表结构和真实列信息,将该虚拟列信息和真实列信息进行融合,得到clickhouse数据库中一个概念表格。该表格在查询列信息运行时在内存中存在,并不是一个真实的数据库表格。下面举一个例子,包括真实列和虚拟列信息的数据库表,即存在于程序的内存中、融合真实列和虚拟列信息的概念表格,如下:[0088][0089]第三步、当收到用户输入的sql查询语句后,运行查询虚拟列信息的过程如下:[0090]步骤31.软件组件读取待转换sql语句(sql_input),解析为抽象语法树(ast)。[0091]步骤32.递归遍历抽象语法树,根据clickhouse的表信息对sql语法树进行语义分析,发现有虚拟列存在时,就将其转换为对实际json列的函数调用。[0092]在本步骤中,可以为若存在虚拟列时,则根据预先设置的虚拟列和json函数之间的对应关系,得到作为查询对象的虚拟列对应的json函数;[0093]使用该虚拟列对应的json函数替代sql查询语句中的虚拟列,得到json函数调用序列。[0094]第四步、最终从抽象语法树转换为sql查询语句(sql_output),输出给调用者。[0095]采用上述实施例,可以实现语句的转换,例如:[0096]输入sql查询语句为:[0097]selectid,status,finished,messagefromtestwherestatus=200andmessage《》”;[0098]转换后的sql查询语句(sql_output)为:[0099]select[0100]id,[0101]jsonextractint(text,'status')asstatus,[0102]jsonextractbool(text,'finished')asfinished,[0103]jsonextractstring(text,'message')message[0104]fromtest[0105]where[0106]status=200andmessage《》”。[0107]在本示例中,首先,使用配置文件定义sql表的虚拟列信息包括名称、类型和对应的json列名;其次,在查询过程中,基于clickhouse表定义数据动态修改sql语句,将sql中的虚拟列引用转换为可实际运行的clickhousejson函数调用序列。[0108]本技术还提供了一种clickhouse数据库虚拟列查询的装置,如图3所示,包括:存储器和处理器;所述存储器用于保存用于clickhouse数据库虚拟列查询的程序;[0109]所述处理器用于读取执行所述用于clickhouse数据库虚拟列查询的程序,执行如下操作:[0110]获取clickhouse数据库配置文件中包含的虚拟列信息;[0111]当收到用户输入的sql查询语句后,如果根据虚拟列信息确定所述sql查询语句中的查询对象包含虚拟列,则根据预先设置的转换规则和所述虚拟列信息将所述sql查询语句转换为clickhousejson函数调用序列。[0112]一种示例性的实施例中,所述获取clickhouse数据库配置文件中包含的虚拟列信息,包括:[0113]获取clickhouse数据库配置文件的数据表结构和真实列信息;[0114]根据所获取的数据表结构、将虚拟列信息添加存储到所对应的真实列名相对应的数据表列中;[0115]确定clickhouse数据库中虚拟列信息,其中,所述虚拟列信息包括:所在数据库中数据表的名称、虚拟列的名称、数据类型和json列名。[0116]一种示例性的实施例中,所述真实列信息包括并不限于:列标识、类型、长度、备注等相关属性。[0117]一种示例性的实施例中,所述根据预先设置的转换规则和所述虚拟列信息将所述sql语句转换为clickhousejson函数调用序列,包括:[0118]将所述sql查询语句解析为抽象语法树;[0119]遍历抽象语法树,根据所述语法树中的上下文信息确定是否存在虚拟列;[0120]若存在虚拟列时,则根据预先设置的虚拟列和json函数之间的对应关系,得到作为查询对象的虚拟列对应的json函数;[0121]使用该虚拟列对应的json函数替代sql查询语句中的虚拟列,得到json函数调用序列。[0122]一种示例性的实施例中,所述存储器还用于:[0123]将所述clickhousejson函数调用序列输出为该原始的查询虚拟列的sql语句转换后的sql语句;[0124]并利用转换后的sql语句查询clickhouse数据库配置文件的虚拟列。[0125]本领域普通技术人员可以理解,上文中所公开方法中的全部或某些步骤、系统、装置中的功能模块/单元可以被实施为软件、固件、硬件及其适当的组合。在硬件实施方式中,在以上描述中提及的功能模块/单元之间的划分不一定对应于物理组件的划分;例如,一个物理组件可以具有多个功能,或者一个功能或步骤可以由若干物理组件合作执行。某些组件或所有组件可以被实施为由处理器,如数字信号处理器或微处理器执行的软件,或者被实施为硬件,或者被实施为集成电路,如专用集成电路。这样的软件可以分布在计算机可读介质上,计算机可读介质可以包括计算机存储介质(或非暂时性介质)和通信介质(或暂时性介质)。如本领域普通技术人员公知的,术语计算机存储介质包括在用于存储信息(诸如计算机可读指令、数据结构、程序模块或其他数据)的任何方法或技术中实施的易失性和非易失性、可移除和不可移除介质。计算机存储介质包括但不限于ram、rom、eeprom、闪存或其他存储器技术、cd-rom、数字多功能盘(dvd)或其他光盘存储、磁盒、磁带、磁盘存储或其他磁存储装置、或者可以用于存储期望的信息并且可以被计算机访问的任何其他的介质。此外,本领域普通技术人员公知的是,通信介质通常包含计算机可读指令、数据结构、程序模块或者诸如载波或其他传输机制之类的调制数据信号中的其他数据,并且可包括任何信息递送介质。当前第1页12当前第1页12
当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1