CN116521941A - 半结构化数据的处理方法、电子设备及存储介质 - Google Patents

半结构化数据的处理方法、电子设备及存储介质 Download PDF

Info

Publication number
CN116521941A
CN116521941A CN202310269778.1A CN202310269778A CN116521941A CN 116521941 A CN116521941 A CN 116521941A CN 202310269778 A CN202310269778 A CN 202310269778A CN 116521941 A CN116521941 A CN 116521941A
Authority
CN
China
Prior art keywords
field
data
path
memory
structured data
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
CN202310269778.1A
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.)
Alibaba China Co Ltd
Original Assignee
Alibaba China 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 Alibaba China Co Ltd filed Critical Alibaba China Co Ltd
Priority to CN202310269778.1A priority Critical patent/CN116521941A/zh
Publication of CN116521941A publication Critical patent/CN116521941A/zh
Pending legal-status Critical Current

Links

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F16/00Information retrieval; Database structures therefor; File system structures therefor
    • G06F16/80Information retrieval; Database structures therefor; File system structures therefor of semi-structured data, e.g. markup language structured data such as SGML, XML or HTML
    • G06F16/81Indexing, e.g. XML tags; Data structures therefor; Storage structures
    • YGENERAL TAGGING OF NEW TECHNOLOGICAL DEVELOPMENTS; GENERAL TAGGING OF CROSS-SECTIONAL TECHNOLOGIES SPANNING OVER SEVERAL SECTIONS OF THE IPC; TECHNICAL SUBJECTS COVERED BY FORMER USPC CROSS-REFERENCE ART COLLECTIONS [XRACs] AND DIGESTS
    • Y02TECHNOLOGIES OR APPLICATIONS FOR MITIGATION OR ADAPTATION AGAINST CLIMATE CHANGE
    • Y02DCLIMATE CHANGE MITIGATION TECHNOLOGIES IN INFORMATION AND COMMUNICATION TECHNOLOGIES [ICT], I.E. INFORMATION AND COMMUNICATION TECHNOLOGIES AIMING AT THE REDUCTION OF THEIR OWN ENERGY USE
    • Y02D10/00Energy efficient computing, e.g. low power processors, power management or thermal management

Landscapes

  • Engineering & Computer Science (AREA)
  • Theoretical Computer Science (AREA)
  • Software Systems (AREA)
  • Data Mining & Analysis (AREA)
  • Databases & Information Systems (AREA)
  • Physics & Mathematics (AREA)
  • General Engineering & Computer Science (AREA)
  • General Physics & Mathematics (AREA)
  • Information Retrieval, Db Structures And Fs Structures Therefor (AREA)

Abstract

本申请提供了一种半结构化数据的处理方法、电子设备及存储介质,属于互联网技术领域。所述方法包括:响应于针对第一半结构化数据的写入请求,基于第一列存结构,将第一半结构化数据按列写入到内存中,第一列存结构为将预设类型的半结构化数据转换为列存形式数据的数据结构模型;响应于本次满足文件写入条件,对第二树形统计结构进行剪枝,得到第二列存结构,第二树形统计结构通过对本次满足文件写入条件时内存中存储过的预设类型的半结构化数据的数据结构统计得到;基于第二列存结构,将内存中列存形式的第一半结构化数据按列写入到数据库的目标文件中。本申请能够提高半结构化数据的数据压缩比,减少所占用的存储空间。

Description

半结构化数据的处理方法、电子设备及存储介质
技术领域
本申请涉及数据处理技术领域,特别涉及一种半结构化数据的处理方法、电子设备及存储介质。
背景技术
半结构化数据是介于结构化数据和非结构化数据之间的数据。半结构化数据能够采用相关标记,对语义元素进行分隔,并对记录和字段进行分层,但是半结构化数据不具有关系型数据库或其他能够将数据结构关联起来的数据模型结构,半结构化数据的数据结构和数据内容混合在一起,没有进行明显的区分。随着互联网技术的发展,数据的差异性变大,半结构化数据的数量日趋增多。如何对半结构化数据进行处理,则成为本领域技术人员较为关注的问题。
目前,相关技术通常将半结构化数据以字符串形式存储在数据库中。然而,采用字符串形式存储的数据压缩比较低,导致采用相关技术存储的半结构化数据占用的存储空间较大。
发明内容
本申请实施例提供了一种半结构化数据的处理方法、电子设备及存储介质,能够提高半结构化数据的压缩比,减少半结构化数据所占用的存储空间。所述技术方案如下:
第一方面,提供了一种半结构化数据的处理方法,所述方法包括:
响应于针对第一半结构化数据的写入请求,基于第一列存结构,将所述第一半结构化数据按列写入到内存中,所述第一半结构化数据为预设类型的半结构化数据,所述第一列存结构为将预设类型的半结构化数据转换为列存形式数据的数据结构模型,所述第一列存结构通过对第一树形统计结构剪枝得到,所述第一树形统计结构通过对前一次满足文件写入条件时所述内存中存储过的预设类型的半结构化数据的数据结构统计得到;
响应于本次满足所述文件写入条件,对第二树形统计结构进行剪枝,得到第二列存结构,所述第二树形统计结构通过对本次满足所述文件写入条件时所述内存中存储过的预设类型的半结构化数据的数据结构统计得到;
基于所述第二列存结构,将所述内存中列存形式的所述第一半结构化数据按列写入到所述数据库的目标文件中。
第二方面,提供了一种半结构化数据的处理装置,所述装置包括:
第一写入模块,用于响应于针对第一半结构化数据的写入请求,基于第一列存结构,将所述第一半结构化数据按列写入到内存中,所述第一半结构化数据为预设类型的半结构化数据,所述第一列存结构为将预设类型的半结构化数据转换为列存形式数据的数据结构模型,所述第一列存结构通过对第一树形统计结构剪枝得到,所述第一树形统计结构通过对前一次满足文件写入条件时所述内存中存储过的预设类型的半结构化数据的数据结构统计得到;
剪枝模块,用于响应于本次满足所述文件写入条件,对第二树形统计结构进行剪枝,得到第二列存结构,所述第二树形统计结构通过对本次满足所述文件写入条件时所述内存中存储过的预设类型的半结构化数据的数据结构统计得到;
第二写入模块,用于基于所述第二列存结构,将所述内存中列存形式的所述第一半结构化数据按列写入到所述数据库的目标文件中。
第三方面,提供了一种电子设备,包括处理器以及存储器;所述存储器存储至少一条程序代码;所述至少一条程序代码用于被所述处理器调用并执行,以实现如第一方面所述的半结构化数据的处理方法。
第四方面,提供了一种计算机可读存储介质,所述计算机可读存储介质中存储有至少一条计算机程序,所述至少一条计算机程序被处理器执行时能够实现如第一方面所述的半结构化数据的处理方法。
第五方面,提供了一种计算机程序产品,所述计算机程序产品包括计算机程序,所述计算机程序被处理器执行时能够实现如第一方面所述的半结构化数据的处理方法。
本申请实施例提供的技术方案带来的有益效果是:
每次在向内存中写入预设类型的半结构数据时,对所写入的预设类型的半结构化数据的数据结构进行分析统计,进而基于内存中存储过的预设类型的半结构化数据的数据结构的统计结果,构建能够反映预设类型的半结构化数据的结构特征的树形统计结构。由于半结构化数据的差异性较大,基于统计结果所构建的树形统计结构的结构模型较大,因而还将对树形统计结构进行剪枝操作,得到存储性能较佳的列存结构。在实际应用过程中,响应于针对预设类型的第一半结构化数据的写入请求,基于前一次满足文件写入条件时所得到的第一列存结构,能够将第一半结构化数据按列写入到内存,从而在内存中存储的数据满足文件写入条件时,将内存中列存形式的第一半结构化数据按列写入到数据库中用于存储第一半结构化数据的目标文件中。采用列存形式,目标文件中只需存储相同列存结构下各个半结构化数据的内容,无需存储其数据结构,大大减少了所存储的数据量,提高了半结构数据的压缩比,减少了半结构化数据所占用的存储空间。
附图说明
为了更清楚地说明本申请实施例中的技术方案,下面将对实施例描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本申请的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他的附图。
图1是本申请实施例提供的一种半结构化数据的处理方法所涉及的实施环境的示意图;
图2是本申请实施例提供的一种半结构化数据的处理方法流程图;
图3是本申请实施例提供的一种Json列存结构的构建过程的示意图;
图4是本申请实施例提供的一种Json列存结构的剪枝过程的示意图;
图5是本申请实施例提供的一种Json数据的数据库写入流程图;
图6是本申请实施例提供的一种对某一Json数据的查询过程的示意图;
图7是本申请实施例提供的一种Json数据的查询流程图;
图8是本申请实施例提供的一种半结构化数据的处理装置的结构示意图;
图9示出了本申请一个示例性实施例提供的一种电子设备的结构框图。
具体实施方式
为使本申请的目的、技术方案和优点更加清楚,下面将结合附图对本申请实施方式作进一步地详细描述。
可以理解,本申请实施例所使用的术语“每个”、“多个”及“任一”等,多个包括两个或两个以上,每个是指对应的多个中的每一个,任一是指对应的多个中的任意一个。举例来说,多个词语包括10个词语,而每个词语是指这10个词语中的每一个词语,任一词语是指10个词语中的任意一个词语。
需要说明的是,本申请所涉及的用户信息(包括但不限于用户设备信息、用户个人信息等)和数据(包括但不限于用于分析的数据、存储的数据、展示的数据等),均为经用户授权或者经过各方充分授权的信息和数据,并且相关数据的收集、使用和处理需要遵守相关国家和地区的相关法律法规和标准,并提供有相应的操作入口,供用户选择授权或者拒绝。
在执行本申请实施例之前,首先对本申请实施例中涉及的名词进行解释。
半结构化数据为介于结构化数据和非结构化数据之间的数据。半结构化数据的数据类型有很多种,包括Json、Jsonb、XML(Extensible Markup Language,可扩展标记语言)、HTML(Hyper Text Markup Language,超文本标记语言)文档等。
Json和Jsonb为两种Json数据类型,Json和Jsonb的区别在于插入速度和查询速度。Json是对输入数据的完整拷贝,会保留输入的空格、重复键以及数据、数据顺序等,在查询时需要解析,因而插入速度快,查询速度较慢。Jsonb将输入的数据解析后再保存为二进制形式,在解析时会删除不必要的空格和重复键,查询时无需再次解析,因而插入速度慢,查询速度快。
OLAP(Online Analytical Processing,在线分析处理)数据库也称分析型数据库,是指一类支持对大规模数据进行较为复杂的联机分析处理的数据库,更关注复杂查询和聚集分析。
Schema(模式)即XML Schema,为指出如何描述XML文档的元素。
ETL是提取(Extract)、转换(Transform)及加载(Load)的简称,一种用于从不同数据源收集数据的数据管道。ETL根据规则对数据进行转换,并将数据加载到半结构化数据存储区中。ETL中的转换工作在专用引擎中进行,通常涉及到使用临时表暂时保存正在转换、并最终要载入其目标的数据。
数据库(Database),简而言之可视为电子化的文件柜——存储电子文件的处所,用户可以对文件中的数据进行新增、查询、更新、删除等操作。所谓“数据库”是以一定方式储存在一起、能与多个用户共享、具有尽可能小的冗余度、与应用程序彼此独立的数据集合。数据库管理系统(英语:Database Management System,简称DBMS)是为管理数据库而设计的电脑软件系统,一般具有存储、截取、安全保障、备份等基础功能。数据库管理系统可以依据它所支持的数据库模型来作分类,例如关系式、XML;或依据所支持的计算机类型来作分类,例如服务器群集、移动电话;或依据所用查询语言来作分类,例如SQL、XQuery;或依据性能冲量重点来作分类,例如最大规模、最高运行速度;亦或其他的分类方式。不论使用哪种分类方式,一些DBMS能够跨类别,例如,同时支持多种查询语言。
近年来随着实时数据仓库的逐渐兴起,各种复杂需求在实时数据仓库中落地。比如用户行为埋点、ABTest等。随着实验、活动等迭代,用户行为埋点的内容会随着迭代而变化。半结构化数据因具有灵活性,通常会使用半结构化进行用户行为埋点。目前大多支持OLAP的数据仓库系统通常可基于固定schema进行列式存储,但是对于半结构化数据(例如Json数据)只能存储为字符串形式,数据压缩比较低,占用的存储空间较大。为了后续分析,需要进行大量ETL操作来解析存储的字符串,导致计算资源和人力成本较高。
为了提高半结构化数据的压缩比,降低半结构化数据所占用的存储空间,本申请实施例提供了一种半结构化数据的处理方法,该方法通过对写入内存中的预设类型的半结构化数据进行解析及统计,构建用于表征预设类型的半结构化数据的数据结构的统计树形结构,并对该统计树形结构进行剪枝操作,得到列存结构,基于该列存结构,可将预设类型的半结构化数据按列写入到内存中,进而在满足文件写入条件时,将内存中列存形式的数据写入到数据库的相应文件中。该方法不仅实现了对预设类型的半结构化数据的列式存储,提高了预设类型的半结构化数据的压缩比,降低了在数据库中所占用的存储空间,而且数据写入过程是实时进行的,无论是在离线写入场景下,还是实时数据写入场景,均可实现预设类型的半结构化数据的列式存储,满足了实时数据库的存储需求,列存性能与固定schema性能相同。
本申请实施例提供的半结构化数据的处理方法可应用于任何需要存储预设类型的半结构化数据的实时数据库中。为了提高实时数据库的数据存储性能,实时数据库的存储过程包括内存存储和文件存储。对于接收到的预设类型的半结构化数据,先基于预设类型的半结构化数据对应的列存结构,将该预设类型的半结构化数据存储到数据库的内存中,进而在符合文件写入条件时,再将内存中列存形式的数据存储到数据库的相应文件中。为优化数据存储性能,该数据库还将定时执行文件合并任务,通过执行文件合并任务,可将多个文件及每个文件对应的列存结构进行合并。在此基础上,该数据库还支持数据查询过程,当接收到针对某一预设类型的半结构化数据的查询请求,响应于该查询请求,从相应文件中查询该预设类型的半结构化数据。由于同一预设类型的半结构化数据可能会由多个文件存储,因而在查询时需要从多个文件中并行查询。
图1示出了本申请实施例提供的半结构化数据的处理方法所涉及的实施环境,参见图1,该实施环境包括:终端101和服务器102。
其中,终端101安装有至少一种类型的应用,包括社交应用、导航应用、购物应用、外卖应用等。在任一种应用运行过程中,当需要将该应用中所产生的预设类型的半结构化数据存储到数据库时,终端101生成针对该预设类型的半结构化数据的写入请求,并将该写入请求发送至服务器102。
服务器102为数据库的运行提供计算、存储等资源支持,用于响应于接收到的写入请求,将预设类型的半结构化数据按列写入到内存中,并在满足文件写入条件时,将内存中列存形式的半结构化数据按列写入到数据库的相应文件中。
上述终端101可以为智能手机、平板电脑、笔记本电脑、台式电脑等,本申请实施例不对终端101的产品类型作具体的限定。服务器102可以是独立的物理服务器,也可以是多个物理服务器构成的服务器集群或者分布式系统,还可以是提供云服务、云数据库、云计算、云函数、云存储、网络服务、云通信、中间件服务、域名服务、安全服务、CDN(ContentDelivery Network,内容分发网络)、以及大数据和人工智能平台等基础云计算服务的云服务器。
上述终端101和服务器102之间可通过网络进行直接或间接地通信,该网络可以为有线网络或无线网络。
本申请实施例提供了一种半结构化数据的处理方法,以服务器102执行本申请实施例,参见图2,本申请实施例提供的方法流程包括:
201、响应于针对第一半结构化数据的写入请求,基于第一列存结构,将第一半结构化数据按列写入到内存中。
在某一应用运行过程中,当需要将该应用生成的第一半结构化数据存储到数据库时,终端生成针对该第一半结构化数据的写入请求,并将该写入请求发送至运行该数据库的服务器。为了提升数据库的存储性能,本申请实施例中,该数据库的存储过程包括内存存储和文件存储。内存存储是指在接收到写入请求时,先将数据临时存储到内存中。文件存储是指当内存中存储的数据满足文件写入条件时,将内存中存储的数据写入到数据库相应的文件中。该文件通常为磁盘文件,能够对写入的数据进行持久化存储。该文件写入条件为触发将内存中存储的数据写入到数据库的相应文件时的条件,该文件写入条件可以为内存中存储数据的数量达到预设数据量,该预设数据量可根据内存的存储空间进行设置,如果内存的存储空间较大,则可将预设数量设置较大的数值,例如128M等,如果内存的存储空间较小,则可将该预设数量设置较小的数值,例如16M等;该文件写入条件还可以为与上次写入时间之间的时间间隔达到预设时间间隔,该预设时间间隔根据需求进行设置,可以为1分钟、2分钟等等。
基于该数据库的存储机制,响应于接收到针对预设类型的第一半结构化数据的写入请求,服务器将该第一半结构化数据写入到内存中。该预设类型可以为Json、Jsonb等,本申请实施例不对预设类型作具体的限定。
相关技术在存储该第一半结构化数据时,通常将该第一半结构化数据以字符串形式写入在内存中,该种存储方式需要同时存储第一半结构化数据的数据结构和数据内容,数据压缩比较小,数据存储量较大,需要占用较大的存储空间,降低了数据库的性能。为了提高第一半结构化数据存储时的压缩比,降低第一半结构化数据所占用的存储空间,本申请实施例提供了第一列存结构,该第一列存结构为将预设类型的半结构化数据转换为列存形式数据的数据结构模型,能够反映出预设类型的半结构化数据的结构特征,基于该第一列存结构可将第一半结构化数据的数据结构和数据内容分离,从而实现对第一半结构化数据的列式存储。由于无需重复存储相同的数据结构,只需存储第一半结构化数据的数据内容,因而提高了第一半结构化数据的压缩比,降低了第一半结构化数据所占用的存储空间。
本申请实施例中第一列存结构为实现第一半结构化数据列式存储的关键,在将第一半结构化数据按列写入到内存中之前,需要先构建第一列存结构。第一列存结构的具体构建过程如下:
第一步,对写入到内存中的每条预设类型的半结构化数据进行解析,得到每条预设类型的半结构化数据的数据结构。
考虑到结构化数据之所以能够实现列式存储,是由于结构化数据具有相同的数据结构,而半结构化数据虽然不具有结构化数据统一的数据结构,但是相比于普通的纯文本数据而言,也具有一定的数据结构,通过对预设类型的半结构化数据的数据结构进行解析及统计,也可以归纳出预设类型的半结构化数据所符合的结构模型。为了归纳出预设类型的半结构化数据所符合的数据模型,本申请实施例每当接收到针对预设类型的半结构化数据的写入请求时,均会对每条写入到内存中的预设类型的半结构化数据进行解析,从而得到每条预设类型的半结构化数据的数据结构。其中,数据结构包括多个路径字段及每个路径字段指示的数据格式。每个路径字段包括至少一个字段,至少一个字段形成一个树形结构,用于表征至少一个字段按照数据层级关系串联起来形成的路径,每个路径字段可采用field表示。路径字段指示的数据格式包括text(字符串格式)、text[](字符串数组格式)、int(整数格式)、bool(布尔型变量格式)、struct(结构格式)等。其中,int包括int2(2个字节,即16位)、int4(4个字节,即32位)等。bool包括true和false两个值。struct表示结构数据,也即是,如果某一路径字段指示的数据格式为struct,则该路径字段对应的字段值并不是一个具体的数值,而是具有一定结构的数据。例如,图3中右图所示的路径字段desc,其指示的数据格式为struct,则该路径字段desc对应的字段值并不是具体的数值,而是以info1、info2、info3、cont及for为子节点的树形结构。
为便于后续推导出预设类型的半结构化数据所适用的数据模型,本申请实施例在对每条预设类型的半结构化数据进行解析之后,还将存储每个路径字段与数据格式之间的对应关系,进而根据每个路径字段与数据格式之间的对应关系,以每个路径字段及对应的数据格式为节点,构建树形统计结构。
进一步地,本申请实施例还将统计每个路径字段的出现频数,进而根据每个路径字段的出现频数,确定出每个路径字段的使用频率,从而根据每个路径字段的使用频率,对所构建的树形统计结构进行优化。
第二步,通过对前一次满足文件写入条件时内存中存储过的预设类型的半结构化数据的数据结构进行统计,构建第一树形统计结构。
通常半结构化数据之间彼此存在差异,随着向内存中写入的预设类型的半结构数据的数量增加,所统计的预设类型的半结构化数据的数据结构将不断变化,基于所统计的预设类型的半结构化数据的数据结构所构建的统计树形结构也将不断更新。为了实现内存中的列存储,本申请实施例以满足文件写入条件时为树形结构的构建时机,基于满足文件写入条件时内存中存储过的预设类型的半结构化数据的数据结构,构建树形统计结构。对于第一半结构化数据来说,将第一半结构化数据按列写入到内存中的第一列存结构所依赖的第一树形结构,通过对前一次满足文件写入条件时内存中存储过的预设类型的半结构化数据的数据结构统计得到。
图3示出了Json数据对应的树形统计结构的构建过程,参见图3中的左图,通过对满足前一次文件写入条件时写入到内存中的Json数据的数据结构进行统计,得到Json数据包括的路径字段分别为:Id、name、desc、key1、key3、desc->info1、desc->info2、desc->info3、desc->cont、desc->for、desc->cont->v等。统计满足前一次文件写入条件时各个路径字段出现频数,其中,Id出现8192次、name出现8192次、desc出现8192次、key1出现300次、key3出现10次、desc->info1出现4000次、desc->info2出现3000次、desc->info3出现2000次、desc->for出现200次等。不同的路径字段指示不同的数据格式,其中,Id指示的数据格式为int4,name指示的数据格式为text,desc指示的数据格式struct,key1指示的数据格式为text,key3指示的数据格式为text,desc->info1指示的数据格式为int4,desc->info2指示的数据格式为bool,desc->info3指示的数据格式为list<int4>,desc->cont指示的数据格式为struct,desc->for指示的数据格式为text,desc->cont->v指示的数据格式为text。基于上述统计结果,可构建图3中右图所示的第一树形统计结构。
第三步,基于预设剪枝条件,对第一树形统计结构包括的路径字段进行剪枝,得到第一列存结构。
由于不同的预设类型的半结构化数据中包括的路径字段是不同的,随着内存中写入的预设类型的半结构化数据的增加,树形统计结构的尺寸越来越大,需要消耗的存储资源也越来越多,而本申请实施例的主要目的是减少数据库中存储资源的占用,提升数据库的存储性能,为实现该目的,本申请实施例设置剪枝条件,进而基于预设剪枝条件,对所构建的树形统计结构进行剪枝,裁剪掉使用频率较低、占用存储空间较大的路径字段,得到列存性能较佳的列存结构。
其中,预设剪枝条件为树形统计结构中需要裁剪掉的路径字段所满足的条件,该预设剪枝条件包括多个剪枝参数,分别为路径字段的行数比例、路径字段的出现频数、路径字段的字段长度、树形统计结构所允许的最大长度的路径字段的数量、路径字段包括的层级数量等。通过对剪枝参数的参数值进行限制,可得到预设剪枝条件。该预设剪枝条件包括以下至少一项:
第一项、如果树形统计结构中任一路径字段的行数比例小于预设比例,则将路径字段从树形统计结构中裁剪掉。
其中,行数比例可通过计算统计时刻内存中存储的预设类型的半结构化数据中某一路径字段出现的行数与总行数的比值得到。预设比例由技术人员进行设置,为0~1之间的数值。
第二项、如果树形统计结构中任一路径字段的出现频数小于预设频数,则将路径字段从树形统计结构中裁剪掉。
其中,预设频数由技术人员进行设置,该预设频数可以为1000000、200000等。
第三项、如果树形统计结构中任一路径字段的字段长度大于预设长度,则将路径字段从树形统计结构中裁剪掉。
其中,预设长度由技术人员进行设置,该预设长度可以为1000000、2000000等。
第四项、如果树形统计结构所允许的最大长度的路径字段的数量大于预设数量,则将最大长度的路径字段的数量裁剪至预设数量。
其中,预设数量由技术人员进行设置,该预设数量可以为100000、20000等。在将最大长度的路径字段的数量裁剪至预设数量之前,可先确定需要裁剪的路径字段,进而对这些需要裁剪的路径字段进行裁剪。而在确定需要裁剪的路径字段时,可从最大长度的路径字段中随机选择,还可基于其他剪枝参数选择,例如,按照行数比例从小到大的顺序进行选择,或者按照出现频数由小到大的顺序进行选择,等等。
第五项、如果树形统计结构中任一路径字段包括的层级数量大于预设层级,则将路径字段从树形统计结构中裁剪掉。
其中,预设层级由技术人员进行设置,该预设层级可以为50、60、100等。
为了更为直观地展示上述预设剪枝条件,下面将预设剪枝条件包括的各项写入到表1中。
表1
进一步地,基于所设置的预设剪枝条件,将第一树形统计结构中符合该预设剪枝条件的路径字段裁剪掉,得到第一列存结构,该第一列存结构采用StructType表示。
对于上述基于预设剪枝条件的剪枝过程,下面以对图3中右图所示的第一树形统计结构进行剪枝操作为例进行说明。假设预设频数为1000次,路径字段key1出现300次、key3出现10次、desc->for出现200次,由于路径字段key1、key3、desc->for出现频数均小于1000次,确定路径字段key1、key3、desc->for符合预设剪枝条件,因而需要将路径字段key1、key3、desc->for裁剪掉,得到图4所示的第一列存结构。
在本申请实施例中,为确保预设类型的半结构化数据能够完整地存储到内存及文件中,对于一些从树形结构中裁剪到的路径字段,将统一采用指定字段表示,该指定字段表示为remaining字段,该指定字段对应的数据采用数据原始的存储形式进行存储,也即是,依然保存为预设类型的半结构化数据的形式,数据结构和数据内容并未分离。例如,从图3中右图所示的第一树形统计结构中裁剪掉的路径字段key1、key3、desc->for对应的数据,将存储到remaining字段对应的存储位置,并以jsonb格式进行存储。
在本申请实施例中,第一列存结构包括多个第一路径字段和指定字段,每个字段在内存中都具有相应的存储位置。在基于第一列存结构,对第一半结构化数据按列写入内存时,先对第一半结构化数据进行解析,得到多个第二路径字段,对于任一第二路径字段,将该第二路径字段与多个第一路径字段进行比较,进而根据比较结果,将该第二路径字段相关的数据按列写入到内存中。
具体地,根据比较结果,将第二路径字段相关的数据按列写入到内存中时,包括以下几种情况:
第一种情况、当第二路径字段与任一第一路径字段相同,且第二路径字段指示的数据格式与第一路径字段指示的数据格式相同,则以第一路径字段为Key值,将第二路径字段的字段值存储到内存中。
第二种情况、当第二路径字段与各个第一路径字段均不相同,则以指定字段为Key值,将第二路径字段所在的整行半结构化数据存储到内存中。
需要说明的是,为便于后续使用,本申请实施例中同一预设类型的半结构化数据在内存中以两种形式存储,一种形式为原始的字符串形式,另一种为列存形式。当满足文件写入条件,将内存中存储的数据写入到数据库的相应文件后,会将内存中存储的原始的字符串形式的数据,以及列存形式的数据均删除,从而使得后续数据能够写入到内存中。
在本申请实施例中,列存形式针对的是兼容列,该兼容列是指待存储数据的路径字段指示的数据格式与第一列存结构中相同路径字段指示的数据格式相同,如果二者不同,则无法将待存储数据中该路径字段对应的字段值,存储到第一列存结构中该路径字段在内存中对应的存储位置中。为便于后续对不兼容列进行处理,当将第一路径字段与多个第二路径字段进行比较后,如果该第二路径字段与某一第一路径字段相同,但是该第二路径字段指示的数据格式与该第一路径字段指示的数据格式不同,则将第一列存结构中的该第一路径字段标记为脏字段。该脏字段用于表示第一列存结构中未采用列存形式写入内存中的字段,脏字段采用dirty来表示。dirty的取值包括0和1,当任一路径字段对应的dirty=1时,表示该路径字段为脏字段;当该路径字段对应的dirty=0时,表示该路径字段不是脏字段。
举例来说,假设第一列存结构为struct<a:text,b:int4,c:text[]>,当前需要写入到内存中的三条Json数据分别为:{"a":"a1","c":["c1","c2","c3"]}、{"a":"a2","b":1,"d":"d1"}、
{"a":"a3","b":"b2"}。表2示出了三条Json数据在该第一列存结构下各个路径字段下的字段值情况,由表2可以看出,对于路径字段a来说,三条Json数据中都包括路径字段a,且三条Json数据中路径字段a对应的字段值的数据格式均为text,且第一列存结构中路径字段a指示的数据格式也是text,由于同一路径字段指示的数据格式相同,因而确定路径字段a不是脏字段,将其对应的dirty的值设置为0;对于路径字段b来说,第一条Json数据中不包括路径字段b,第二条Json数据和第三条Json数据中包括路径字段b,但是第二条Json数据中路径字段b对应的字段值1的数据格式为text,第三条Json数据中路径字段b对应的字段值b2的数据格式为字符串,第一列存结构中路径字段a指示的数据格式为int4,由于同一路径字段指示的数据格式不同,因而确定路径字段b为脏字段,将其对应的dirty的值设置为1;对于路径字段c来说,第一条Json数据中包括路径字段c,第二条Json数据和第三条Json数据中不包括路径字段c,第一条Json数据中路径字段c对应的字段值c1、c2、c3的数据格式为text[],第一列存结构中路径字段c指示的数据格式也是text[],由于同一路径字段指示的数据格式相同,因而确定路径字段c不是脏字段,将其对应的dirty的值设置为0。
表2
进一步,本申请实施例在对第一半结构化数据进行解析得到多个第二路径字段之后,还将基于对第一半结构化数据的解析结果,对第一半结构化数据的数据结构进行统计,从而在满足文件写入条件时,基于内存中存储过的预设类型的半结构化数据的统计结果,构建第二树形统计结构。
202、响应于本次满足文件写入条件,对第二树形统计结构进行剪枝,得到第二列存结构。
当检测到内存中存储的数据本次满足文件写入条件,则基于本次满足文件写入条件时内存中存储过的预设类型的半结构化数据的数据结构统计,构建第二树形统计结构,并基于预设剪枝条件,对第二树形统计结构包括的路径字段进行剪枝,得到第二列存结构。对于基于预设剪枝条件,对第二树形统计结构包括的路径字段进行剪枝,得到第二列存结构的方法,可参见上述对第一树形统计结构进行剪枝操作得到第一列存结构的方法,此处不再赘述。
本申请实施例所构建的树形统计结构及基于树形统计结构得到的列存结构并不是固定不变的,而是随着统计数据的变化而变化,通过不断调整列存结构,提高了列存结构的普适性。
203、基于第二列存结构,将内存中列存形式的第一半结构化数据按列写入到数据库的目标文件中。
其中,目标文件为数据库中用于存储预设类型的半结构化数据。基于第二列存结构,将内存中列存形式的第一半结构化数据按列写入到数据库的目标文件中,包括但不限于如下几种情况:
第一种情况、对于内存中任一列对应的目标路径字段,当第一列存结构和第二列存结构同时包括目标路径字段,则以目标路径字段为Key值,将目标路径字段的字段值写入到目标文件中。
由于第二列存结构是在第一列存结构基础上推导出来的,因而第一列存结构和第二列存结构中包括的路径字段大部分都能重叠,对于这些重叠的路径字段,可直接按照内存中的列存形式,以目标路径字段为Key值,将目标路径字段的字段值写入到目标文件中。
第二种情况、当第一列存结构不包括目标路径字段,而第二列存结构包括目标路径字段,则基于指定字段,从内存中解析出目标路径字段对应的字段值,并以目标路径字段为Key值,将目标路径字段的字段值写入到目标文件中。
对于新增的路径字段,由于内存中并未将其数据结构及数据内容分离,因而需要从内存中指定字段对应的存储位置,解析出该目标路径字段对应的字段值,然后再以目标路径字段为Key值,将目标路径字段的字段值写入到目标文件中。
第三种情况、当第一列存结构包括目标路径字段,而第二列存结构不包括目标路径字段,则以指定字段为Key值,将目标路径字段所在的整行半结构化数据写入到目标文件中。
对于删除的路径字段,虽然内存中按列存储时将其数据结构及数据内容分离,但是由于目标文件存储时并未要求其数据结构及数据内容分离,因而可将目标路径合并到指定字段中,并以指定字段为Key值,将目标路径字段所在的整行半结构化数据写入到目标文件中。
第四种情况、当目标路径字段在第一列存结构中被标记为脏字段,则获取目标路径字段所在的整行半结构化数据,并以指定字段为Key值,将目标路径字段所在的整行半结构化数据写入到目标文件中。
对于脏字段,由于内存中并未存储该字段对应的数据,因而需要从内存中存储的原始半结构化数据中获取该目标路径字段所在的整行半结构化数据,然后以指定字段为Key值,将该目标路径字段所在的整行半结构化数据写入到目标文件中。
对于上述的第二种情况和第三种情况,下面结合图表3和表4进行说明。表3为内存中的Json数据的存储形式:
表3
假设在推导第二列存结构时删除了第一列存结构中的路径字段c,这样原来路径字段c下的字段值“c1”、“c2”、“c3”将存储到remaining字段下,同时第二列存结构中增加了路径字段d,这样原来remaining字段下Json数据"d":"d1"将存储到路径字段d下。具体的存储形式可参见表4。
表4
/>
本申请实施例在基于第二列存结构,将内存中列存形式的第一半结构化数据按列写入到数据库的目标文件后,还将第二列存结构对应的元数据写入到元数据文件中,从而在后继进行数据查询时,能够基于元数据文件中存储的元数据从相应文件中查询数据。
采用本申请实施例提供的方法实现了对预设类型的半结构化数据在内存及文件中的列式存储,提高了数据压缩比,减少了文件中所占用的存储空间。
为提高数据存储和查询效率,本申请实施例还将对数据库中文件执行合并任务,以将数据库中的多个文件合并成一个大文件。具体地,判断多个第一文件是否满足文件合并条件,该多个第一文件为数据库中用于存储预设类型的半结构化数据的文件,该文件合并条件可以为数据库内第一文件的数量达到一定数量,还可以为达到合并时间等。当满足文件合并条件时,从元数据文件中获取多个第一文件对应的列存结构,进而将多个第一文件对应的列存结构进行合并,得到合并列存结构,然后基于合并列存结构,将多个第一文件中的数据按列写入到合并列存结构对应的合并文件中。
在将多个第一文件对应的列存结构进行合并时,需要删除重复的路径字段,同时最大限度地保留列存结构。具体地,对于任意两个第一文件,当两个第一文件对应的列存结构包括相同路径字段,且相同路径字段指示的数据格式相同,则将相同路径字段合并成一个路径字段;当两个第一文件对应的列存结构包括不同路径字段,则保留不同路径字段;当两个第一文件对应的列存结构包括相同路径字段,而相同路径字段指示的数据格式不同,则将相同路径字段裁剪掉,使其退化成原始的半结构化数据的形式。
图5示出了对Jsonb数据的处理过程,参见图5,当接收到任一Jsonb数据的写入请求,对该Jsonb数据进行解析及统计,同时基于上一次推导得到StructType(第一列存结构),将Jsonb数据按列写入到内存中。当满足文件写入条件时,基于Jsonb统计结构进行列存结构推导,得到本次推导得到的StructType(第二列存结构),然后基于本次推导得到的StructType,将内存中列存形式的Jsonb数据按列写入到目标文件中。当满足文件合并条件时,将多个文件对应的StructType进行合并,得到合并列存结构,进而基于合并列存结构,将各个文件中存储的数据写入到合并文件中。
需要说明的是,上述从内存中推导列存结构为例进行说明,实际上,还可在文件中推导列存结构,无论在什么阶段推导列存结构,都可实现对预设类型的半结构化数据的列式存储。
本申请实施例提供的方法还支持对文件中存储的数据进行查询。具体地,接收针对预设格式(例如text格式等)的第二半结构化数据中第三路径字段的目标字段值的第一查询请求,响应于该第一查询请求,基于数据库的元数据文件,获取用于存储第二半结构化数据的多个第二文件对应的列存结构。由于第一查询请求针对的是原始的半结构化数据,用于对原始的半结构化数据进行查询,而多个第二文件中存储的是列存形式的第二半结构化数据,因此,需要根据每个第二文件对应的列存结构和第三路径字段,对第一查询请求进行改写,得到每个第二文件对应的第二查询请求,从而基于每个第二文件对应的第二查询请求,从每个第二文件中查询预设格式的目标字段值。
为实现对第一查询请求的改写,本申请实施例预先设置多个函数,包括原始访问路径函数、列存访问路径函数及格式转换函数等。其中,原始访问路径函数为对原始的半结构化数据进行查询的函数,用于访问预设类型的半结构化数据。假设预设类型的半结构化数据为jsonb数据,则原始访问路径函数为从jsonb访问某路径的函数,该原始访问路径函数表示为jsonb_object_field(<jsonb>,<path>)。举例来说,如果需要查询的数据为jsonb数据中路径字段a下的路径字段b的字段值,并将查询到的字段值的数据格式转换成text格式,该数据查询过程表示为:j->'a'->>'b',其中,->表示获取字段路径下的字段值,->>表示获取字段路径下的字段值,并将字段值的数据格式转换成text格式,则第一查询请求中的原始访问路径函数为jsonb_object_field(jsonb_object_field(j,'a'),'b')。
列存访问路径函数为对列存形式的半结构化数据进行查询的函数,用于直接从数据库相应文件中列存形式的数据中读取字段值。假设预设类型的半结构化数据为jsonb数据,则列存访问路径函数表示为get_column(<path list>)。
格式转换函数为将字段值由其他格式转换为预设格式的函数,用于对数据格式进行转换。根据实际格式转换需求,该格式转换函数有多个。假设预设类型的半结构化数据为jsonb数据,需要获取的是text格式的数据,则格式转换函数包括用于将其他格式转换为jsonb格式的函数及用于将jsonb格式转换为text格式的函数,其中,用于将其他格式转换为jsonb格式的函数为cast_to_jsonb(),用于将jsonb格式转换为text格式的函数为cast_to_text()。
由于不同的第二文件对应不同的列存结构,不同的列存结构下的数据具有不同的存储形式,而针对不同存储形式下的数据进行查询时,所采用的查询方法也是不同的,因此,在接收到第一查询请求时,针对不同的第二文件,本申请实施例将不同的方法对第一查询请求进行改写,从而能够在不同的第二文件中查询到预设格式的目标字段值。
具体地,包括以下几种情况:
第一种情况、对于任一第二文件对应的列存结构,当列存结构包括第三路径字段,且列存结构所包括的第三路径字段指示的数据格式为预设格式,则将第一查询请求中的原始访问路径函数改写成列存访问路径函数,得到第二查询请求。
当第二文件中第三路径字段指示的存储位置中直接存储着预设格式的目标字段值,无需进行其他转换,直接将访问预设类型的半结构化数据的原始访问路径函数,替换成从数据库相应文件中列存形式的数据中读取字段值的列存访问路径函数即可。
第二种情况、当第三路径字段为列存结构中的指定字段,则在原始访问路径函数中嵌套列存访问路径函数,得到第二查询请求。
由于目标字段值存储在第二文件的指定字段下,需要先从指定字段下获取目标字段值相关的预设类型的半结构化数据,再从该半结构化数据中获取预设格式的目标字段值,因此,需要在原始访问路径函数中嵌套用于从指定字段下获取该半结构化数据的列存访问路径函数。
第三种情况、当列存结构包括第三路径字段,而列存结构所包括的第三路径字段指示的数据格式不为预设格式,则将原始访问路径函数改写成嵌套函数,得到第二查询请求。
其中,嵌套函数由列存访问路径函数和格式转换函数嵌套而成,该嵌套函数中所嵌套的格式转换函数根据需要查询数据的数据格式及文件中存储的该数据的数据格式确定。
对于上述几种改写情况,下面将结合图6进行说明。参见图6,需要查询jsonb数据中路径字段a下的路径字段b的字段值,并将查询到的字段值的数据格式转换成text格式,即j->'a'->>'b',接收到的第一查询请求中包括的原始访问路径函数为:Jsonb_object_field_text(Jsonb_object_field(j,‘a’),‘b’)。数据库中存储该数据的文件有三个,分别为文件1、文件2及文件3,三个文件如下:
文件1:struct<a:struct<b:text,c:int>,d:text[],remaining:jsonb>
文件2:struct<a:struct<c:int>,d:text[],remaining:jsonb>
文件3:struct<a:struct<b:struct<b1:text,b2:int>>,remaining:jsonb>
对于文件1,其对应的路径字段中包括j->'a'->>'b',且b的数据格式也是text,则将第一查询请求中包括的原始访问路径函数改写为get_column(j,[‘a’,‘b’])。
对于文件2,其对应的路径字段中不包括j->'a'->>'b','b'在remaining字段中,需要改写成从remaining字段中获取,则将第一查询请求中包括的原始访问路径函数改写为Jsonb_object_field_textJsonb_object_field(get_column(j,‘remaining’),‘a’),‘b’)。
对于文件3,其对应的路径字段中包括j->'a'->>'b',但是'b'本身是个StructType,需要直接获取StructType并转换成jsonb,然后再转换成text,则将第一查询请求中包括的原始访问路径函数改写为cast_to_text(cast_to_Jsonb(get_column(j,[‘a’,‘b’])))。
基于改写后的第二查询请求,即可从相应文件中查询出字段b对应的text格式的字段值。
图7示出了Json数据的查询流程,整体查询流程如下:
第一步,接收针对预设格式的Json数据中某一路径字段下字段值的查询请求,该查询请求包括查询算子(即原始访问路径函数);
第二步,基于该查询请求,确定数据库中存储该Json数据的各个文件,获取并加载每个文件的Json列对应的StructType(即列存结构);
第三步,基于每个文件对应的StructType,对查询请求中的查询算子进行改写,得到每个文件对应的改写后的查询请求;
第四步,基于每个文件对应的改写后的查询请求,各文件并行执行查询操作,以从每个文件中查询Json数据中该路径字段下字段值。
以预设类型的半结构化数据为Json数据为例,相关技术在存储Json数据时,需要将该Json数据以字符串形式存储在内存及文件中,采用该种存储方法占用的存储空间较大,在进行数据查询时,即便需要查询的只是该Json数据中某一路径字段对应的字段值,也需要将该Json数据全部从文件中读取出来,然后在内存中进行分析,采用该种查询方法需要消耗较多的网络资源和存储资源。而采用本申请实施例的方法在存储的时候,将Json数据按列存储到内存及文件中,所占用的存储空间较小,查询时最大限度地利用列存结构的结构特点,只读取各个文件中必要的数据,不会读取其他冗余数据,减少了查询过程所消耗的计算资源和存储资源,查询性能较高。
本申请实施例提供的方法,每次在向内存中写入预设类型的半结构数据时,对所写入的预设类型的半结构化数据的数据结构进行分析统计,进而基于内存中存储过的预设类型的半结构化数据的数据结构的统计结果,构建能够反映预设类型的半结构化数据的结构特征的树形统计结构。由于半结构化数据的差异性较大,基于统计结果所构建的树形统计结构的结构模型较大,因而还将对树形统计结构进行剪枝操作,得到存储性能较佳的列存结构。在实际应用过程中,响应于针对预设类型的第一半结构化数据的写入请求,基于前一次满足文件写入条件时所得到的第一列存结构,能够将第一半结构化数据按列写入到内存,从而在内存中存储的数据满足文件写入条件时,将内存中列存形式的第一半结构化数据按列写入到数据库中用于存储第一半结构化数据的目标文件中。采用列存形式,目标文件中只需存储相同列存结构下各个半结构化数据的内容,无需存储其数据结构,大大减少了所存储的数据量,提高了半结构数据的压缩比,减少了半结构化数据所占用的存储空间。
请参考图8,其示出了本申请实施例提供了一种半结构化数据的处理装置的结构示意图,该装置可以通过软件、硬件或者二者结合实现,成为服务器102的全部或一部分,该装置包括:
第一写入模块801,用于响应于针对第一半结构化数据的写入请求,基于第一列存结构,将第一半结构化数据按列写入到内存中,该第一半结构化数据为预设类型的半结构化数据,该第一列存结构为将预设类型的半结构化数据转换为列存形式数据的数据结构模型,该第一列存结构通过对第一树形统计结构剪枝得到,该第一树形统计结构通过对前一次满足文件写入条件时内存中存储过的预设类型的半结构化数据的数据结构统计得到;
剪枝模块802,用于响应于本次满足文件写入条件,对第二树形统计结构进行剪枝,得到第二列存结构,该第二树形统计结构通过对本次满足文件写入条件时内存中存储过的预设类型的半结构化数据的数据结构统计得到;
第二写入模块803,用于基于第二列存结构,将内存中列存形式的第一半结构化数据按列写入到数据库的目标文件中。
在本申请的另一个实施例中,第一列存结构包括多个第一路径字段,第一路径字段用于表征将多个字段按照数据层级关系串联起来所形成的路径,第一写入模块801,用于对第一半结构化数据进行解析,得到多个第二路径字段;对于任一第二路径字段,将第一路径字段与多个第二路径字段进行比较;根据比较结果,将第二路径字段相关的数据按列写入到内存中。
在本申请的另一个实施例中,第一列存结构还包括指定字段,指定字段对应的数据以预设类型的半结构化数据形式存储,第一写入模块801,用于当第二路径字段与任一第一路径字段相同,且第二路径字段指示的数据格式与第一路径字段指示的数据格式相同,则以第一路径字段为Key值,将第二路径字段的字段值存储到内存中;当第二路径字段与各个第一路径字段均不相同,则以指定字段为Key值,将第二路径字段所在的整行半结构化数据存储到内存中。
在本申请的另一个实施例中,该装置还包括:
标记模块,用于当第二路径字段与第一路径字段相同,而第二路径字段指示的数据格式与第一路径字段指示的数据格式不同,将第一列存结构中的第一路径字段标记为脏字段,脏字段用于表示第一列存结构中未采用列存形式写入内存中的字段。
在本申请的另一个实施例中,该装置还包括:
解析模块,用于对写入到内存中的每条预设类型的半结构化数据进行解析,得到每条预设类型的半结构化数据的数据结构;
统计模块,用于通过对前一次满足文件写入条件时内存中存储过的预设类型的半结构化数据的数据结构进行统计,构建第一树形统计结构;
剪枝模块,用于基于预设剪枝条件,对第一树形统计结构包括的路径字段进行剪枝,得到第一列存结构。
在本申请的另一个实施例中,剪枝模块802,用于基于预设剪枝条件,对第二树形统计结构包括的路径字段进行剪枝,得到第二列存结构。
在本申请的另一个实施例中,预设剪枝条件包括以下至少一项:
如果树形统计结构中任一路径字段的行数比例小于预设比例,则将路径字段从树形统计结构中裁剪掉;
如果树形统计结构中任一路径字段的出现频数小于预设频数,则将路径字段从树形统计结构中裁剪掉;
如果树形统计结构中任一路径字段的字段长度大于预设长度,则将路径字段从树形统计结构中裁剪掉;
如果树形统计结构所允许的最大长度的路径字段的数量大于预设数量,则将最大长度的路径字段的数量裁剪至预设数量;
如果树形统计结构中任一路径字段包括的层级数量大于预设层级,则将路径字段从树形统计结构中裁剪掉。
在本申请的另一个实施例中,第二写入模块803,用于对于内存中任一列对应的目标路径字段,当第一列存结构和第二列存结构同时包括目标路径字段,则以目标路径字段为Key值,将目标路径字段的字段值写入到目标文件中;当第一列存结构不包括目标路径字段,而第二列存结构包括目标路径字段,则基于指定字段,从内存中解析出目标路径字段对应的字段值,并以目标路径字段为Key值,将目标路径字段的字段值写入到目标文件中;当第一列存结构包括目标路径字段,而第二列存结构不包括目标路径字段,则以指定字段为Key值,将目标路径字段所在的整行半结构化数据写入到目标文件中;当目标路径字段在第一列存结构中被标记为脏字段,则获取目标路径字段所在的整行半结构化数据,并以指定字段为Key值,将目标路径字段所在的整行半结构化数据写入到目标文件中,脏字段用于表示第一列存结构中未采用列存形式写入内存中的字段。
在本申请的另一个实施例中,该装置还包括:
第一获取模块,用于获取多个第一文件对应的列存结构,第一文件为数据库中用于存储预设类型的半结构化数据的文件;
合并模块,用于将多个第一文件对应的列存结构进行合并,得到合并列存结构;
第三写入模块,用于基于合并列存结构,将多个第一文件中的数据按列写入到合并列存结构对应的合并文件中。
在本申请的另一个实施例中,合并模块,用于对于任意两个第一文件,当两个第一文件对应的列存结构包括相同路径字段,且相同路径字段指示的数据格式相同,则将相同路径字段合并成一个路径字段;当两个第一文件对应的列存结构包括不同路径字段,则保留不同路径字段;当两个第一文件对应的列存结构包括相同路径字段,而相同路径字段指示的数据格式不同,则将相同路径字段裁剪掉。
在本申请的另一个实施例中,该装置还包括:
第二获取模块,用于响应于针对预设格式的第二半结构化数据中第三路径字段的目标字段值的第一查询请求,获取多个第二文件对应的列存结构,该第一查询请求用于对原始的半结构化数据进行查询,第二文件为数据库中用于存储第二半结构化数据的文件;
改写模块,用于根据每个第二文件对应的列存结构和第三路径字段,对第一查询请求进行改写,得到每个第二文件对应的第二查询请求,第二查询请求用于对列存形式的半结构化数据进行查询;
查询模块,用于基于每个第二文件对应的第二查询请求,从每个第二文件中查询预设格式的目标字段值。
在本申请的另一个实施例中,改写模块,用于对于任一第二文件对应的列存结构,当列存结构包括第三路径字段,且列存结构所包括的第三路径字段指示的数据格式为预设格式,则将第一查询请求中的原始访问路径函数改写成列存访问路径函数,得到第二查询请求,该原始访问路径函数为对原始的半结构化数据进行查询的函数,列存访问路径函数为对列存形式的半结构化数据进行查询的函数;当第三路径字段为列存结构中的指定字段,则在原始访问路径函数中嵌套列存访问路径函数,得到第二查询请求;当列存结构包括第三路径字段,而列存结构所包括的第三路径字段指示的数据格式不为预设格式,则将原始访问路径函数改写成嵌套函数,得到第二查询请求,该嵌套函数由列存访问路径函数和格式转换函数嵌套而成,该格式转换函数为将字段值由其他格式转换为预设格式的函数。
综上所述,本申请实施例提供的装置,每次在向内存中写入预设类型的半结构数据时,对所写入的预设类型的半结构化数据的数据结构进行分析统计,进而基于内存中存储过的预设类型的半结构化数据的数据结构的统计结果,构建能够反映预设类型的半结构化数据的结构特征的树形统计结构。由于半结构化数据的差异性较大,基于统计结果所构建的树形统计结构的结构模型较大,因而还将对树形统计结构进行剪枝操作,得到存储性能较佳的列存结构。在实际应用过程中,响应于针对预设类型的第一半结构化数据的写入请求,基于前一次满足文件写入条件时所得到的第一列存结构,能够将第一半结构化数据按列写入到内存,从而在内存中存储的数据满足文件写入条件时,将内存中列存形式的第一半结构化数据按列写入到数据库中用于存储第一半结构化数据的目标文件中。采用列存形式,目标文件中只需存储相同列存结构下各个半结构化数据的内容,无需存储其数据结构,大大减少了所存储的数据量,提高了半结构数据的压缩比,减少了半结构化数据所占用的存储空间。
图9示出了本申请一个示例性实施例提供的一种电子设备900的结构框图,该电子设备900可以为图1所示的服务器102。通常,电子设备900包括有:处理器901和存储器902。
处理器901可以采用DSP(Digital Signal Processing,数字信号处理)、FPGA(Field-Programmable Gate Array,现场可编程门阵列)、PLA(Programmable LogicArray,可编程逻辑阵列)中的至少一种硬件形式来实现。处理器901也可以包括主处理器和协处理器,主处理器是用于对在唤醒状态下的数据进行处理的处理器;协处理器是用于对在待机状态下的数据进行处理的低功耗处理器。在一些实施例中,处理器901可以在集成有GPU(Graphics Processing Unit,图像处理器),GPU用于负责显示屏所需要显示的内容的渲染和绘制。一些实施例中,处理器901还可以包括人工智能处理器,该人工智能处理器用于处理有关机器学习的计算操作。
存储器902可以包括一个或多个计算机可读存储介质,该计算机可读存储介质可以是可以是非临时性计算机可读存储介质,例如,所述非临时性计算机可读存储介质可以是CD-ROM(Compact Disc Read-Only Memory,只读光盘)、ROM、RAM(Random AccessMemory,随机存取存储器)、磁带、软盘和光数据存储设备等。该计算机可读存储介质中存储有至少一条计算机程序,该至少一条计算机程序被执行时能够实现半结构化数据的处理方法。
当然,上述电子设备必然还可以包括其他部件,例如输入/输出接口、通信组件等。输入/输出接口为处理器和外围接口模块之间提供接口,上述外围接口模块可以是输出设备、输入设备等。通信组件被配置为便于电子设备和其他设备之间有线或无线方式的通信等。
本领域技术人员可以理解,图9中示出的结构并不构成对电子设备900的限定,可以包括比图示更多或更少的组件,或者组合某些组件,或者采用不同的组件布置。
本申请实施例提供了一种计算机可读存储介质,所述计算机可读存储介质中存储有至少一条计算机程序,所述至少一条计算机程序被处理器执行时能够实现半结构化数据的处理方法。
本申请实施例提供了一种计算机程序产品,所述计算机程序产品包括计算机程序,所述计算机程序被处理器执行时能够实现半结构化数据的处理方法。
所属领域的技术人员可以清楚地了解到,为描述的方便和简洁,上述描述的系统,装置和单元的具体工作过程,可以参考前述方法实施例中的对应过程,在此不再赘述。
以上实施例仅用以说明本申请的技术方案,而非对其限制;尽管参照前述实施例对本申请进行了详细的说明,本领域的普通技术人员应当理解:其依然可以对前述各实施例所记载的技术方案进行修改,或者对其中部分技术特征进行等同替换;而这些修改或者替换,并不使相应技术方案的本质脱离本申请各实施例技术方案的精神和范围。

Claims (14)

1.一种半结构化数据的处理方法,其特征在于,所述方法包括:
响应于针对预设类型的第一半结构化数据的写入请求,基于第一列存结构,将所述第一半结构化数据按列写入到内存中,所述第一列存结构为将预设类型的半结构化数据转换为列存形式数据的数据结构模型,所述第一列存结构通过对第一树形统计结构剪枝得到,所述第一树形统计结构通过对前一次满足文件写入条件时所述内存中存储过的预设类型的半结构化数据的数据结构统计得到;
响应于本次满足所述文件写入条件,对第二树形统计结构进行剪枝,得到第二列存结构,所述第二树形统计结构通过对本次满足所述文件写入条件时所述内存中存储过的预设类型的半结构化数据的数据结构统计得到;
基于所述第二列存结构,将所述内存中列存形式的所述第一半结构化数据按列写入到所述数据库的目标文件中。
2.根据权利要求1所述的方法,其特征在于,所述第一列存结构包括多个第一路径字段,所述第一路径字段用于表征将多个字段按照数据层级关系串联起来所形成的路径,所述基于第一列存结构,将所述第一半结构化数据按列写入到内存中,包括:
对所述第一半结构化数据进行解析,得到多个第二路径字段;
对于任一第二路径字段,将所述第二路径字段与多个第一路径字段进行比较;
根据比较结果,将所述第二路径字段相关的数据按列写入到内存中。
3.根据权利要求2所述的方法,其特征在于,所述第一列存结构还包括指定字段,所述指定字段对应的数据以预设类型的半结构化数据形式存储,所述根据比较结果,将所述第二路径字段相关的数据按列写入到内存中,包括:
当所述第二路径字段与任一第一路径字段相同,且所述第二路径字段指示的数据格式与所述第一路径字段指示的数据格式相同,则以所述第一路径字段为Key值,将所述第二路径字段的字段值存储到所述内存中;
当所述第二路径字段与各个第一路径字段均不相同,则以所述指定字段为Key值,将所述第二路径字段所在的整行半结构化数据存储到所述内存中。
4.根据权利要求3所述的方法,其特征在于,所述方法还包括:
当所述第二路径字段与所述第一路径字段相同,而所述第二路径字段指示的数据格式与所述第一路径字段指示的数据格式不同,将所述第一列存结构中的所述第一路径字段标记为脏字段,所述脏字段用于表示所述第一列存结构中未采用列存形式写入所述内存中的字段。
5.根据权利要求1所述的方法,其特征在于,所述基于第一列存结构,将所述第一半结构化数据按列写入到内存中之前,还包括:
对写入到所述内存中的每条预设类型的半结构化数据进行解析,得到每条预设类型的半结构化数据的数据结构;
通过对前一次满足所述文件写入条件时所述内存中存储过的预设类型的半结构化数据的数据结构进行统计,构建所述第一树形统计结构;
基于预设剪枝条件,对所述第一树形统计结构包括的路径字段进行剪枝,得到所述第一列存结构。
6.根据权利要求1所述的方法,其特征在于,所述对第二树形统计结构进行剪枝,得到第二列存结构,包括:
基于预设剪枝条件,对所述第二树形统计结构包括的路径字段进行剪枝,得到所述第二列存结构。
7.根据权利要求5或6所述的方法,其特征在于,所述预设剪枝条件包括以下至少一项:
如果树形统计结构中任一路径字段的行数比例小于预设比例,则将所述路径字段从所述树形统计结构中裁剪掉;
如果树形统计结构中任一路径字段的出现频数小于预设频数,则将所述路径字段从所述树形统计结构中裁剪掉;
如果树形统计结构中任一路径字段的字段长度大于预设长度,则将所述路径字段从所述树形统计结构中裁剪掉;
如果树形统计结构所允许的最大长度的路径字段的数量大于预设数量,则将最大长度的路径字段的数量裁剪至预设数量;
如果树形统计结构中任一路径字段包括的层级数量大于预设层级,则将所述路径字段从所述树形统计结构中裁剪掉。
8.根据权利要求3所述的方法,其特征在于,所述基于所述第二列存结构,将所述内存中列存形式的所述第一半结构化数据按列写入到所述数据库的目标文件中,包括:
对于所述内存中任一列对应的目标路径字段,当所述第一列存结构和所述第二列存结构同时包括所述目标路径字段,则以所述目标路径字段为Key值,将所述目标路径字段的字段值写入到所述目标文件中;
当所述第一列存结构不包括所述目标路径字段,而所述第二列存结构包括所述目标路径字段,则基于所述指定字段,从所述内存中解析出所述目标路径字段对应的字段值,并以所述目标路径字段为Key值,将所述目标路径字段的字段值写入到所述目标文件中;
当所述第一列存结构包括所述目标路径字段,而所述第二列存结构不包括所述目标路径字段,则以所述指定字段为Key值,将所述目标路径字段所在的整行半结构化数据写入到所述目标文件中;
当所述目标路径字段在所述第一列存结构中被标记为脏字段,则获取所述目标路径字段所在的整行半结构化数据,并以所述指定字段为Key值,将所述目标路径字段所在的整行半结构化数据写入到所述目标文件中,所述脏字段用于表示所述第一列存结构中未采用列存形式写入所述内存中的字段。
9.根据权利要求1所述的方法,其特征在于,所述基于所述第二列存结构,将所述内存中列存形式的所述第一半结构化数据按列写入到所述数据库的目标文件中之后,还包括:
获取多个第一文件对应的列存结构,所述第一文件为所述数据库中用于存储预设类型的半结构化数据的文件;
将所述多个第一文件对应的列存结构进行合并,得到合并列存结构;
基于所述合并列存结构,将所述多个第一文件中的数据按列写入到所述合并列存结构对应的合并文件中。
10.根据权利要求9所述的方法,其特征在于,所述将所述多个文件对应的列存结构进行合并,得到合并列存结构,包括:
对于任意两个第一文件,当所述两个第一文件对应的列存结构包括相同路径字段,且相同路径字段指示的数据格式相同,则将相同路径字段合并成一个路径字段;
当所述两个第一文件对应的列存结构包括不同路径字段,则保留不同路径字段;
当所述两个第一文件对应的列存结构包括相同路径字段,而相同路径字段指示的数据格式不同,则将所述相同路径字段裁剪掉。
11.根据权利要求3至10中任一项所述的方法,其特征在于,所述基于所述第二列存结构,将所述内存中列存形式的所述第一半结构化数据按列写入到所述数据库的目标文件中之后,还包括:
响应于针对预设格式的第二半结构化数据中第三路径字段的目标字段值的第一查询请求,获取多个第二文件对应的列存结构,所述第一查询请求用于对原始的半结构化数据进行查询,所述第二文件为所述数据库中用于存储所述第二半结构化数据的文件;
根据每个第二文件对应的列存结构和所述第三路径字段,对所述第一查询请求进行改写,得到每个第二文件对应的第二查询请求,所述第二查询请求用于对列存形式的半结构化数据进行查询;
基于每个第二文件对应的第二查询请求,从每个第二文件中查询预设格式的所述目标字段值。
12.根据权利要求11所述的方法,其特征在于,所述根据每个第二文件对应的列存结构和所述第三路径字段,对所述第一查询请求进行改写,得到每个第二文件对应的第二查询请求,包括:
对于任一第二文件对应的列存结构,当所述列存结构包括所述第三路径字段,且所述列存结构所包括的第三路径字段指示的数据格式为预设格式,则将所述第一查询请求中的原始访问路径函数改写成列存访问路径函数,得到所述第二查询请求,所述原始访问路径函数为对原始的半结构化数据进行查询的函数,所述列存访问路径函数为对列存形式的半结构化数据进行查询的函数;
当所述第三路径字段为所述列存结构中的指定字段,则在所述原始访问路径函数中嵌套列存访问路径函数,得到所述第二查询请求;
当所述列存结构包括所述第三路径字段,而所述列存结构所包括的第三路径字段指示的数据格式不为预设格式,则将原始访问路径函数改写成嵌套函数,得到所述第二查询请求,所述嵌套函数由所述列存访问路径函数和格式转换函数嵌套而成,所述格式转换函数为将字段值由其他格式转换为预设格式的函数。
13.一种电子设备,其特征在于,包括处理器以及存储器;所述存储器存储至少一条程序代码;所述至少一条程序代码用于被所述处理器调用并执行,以实现如权利要求1至12中任一项所述的半结构化数据的处理方法。
14.一种计算机可读存储介质,其特征在于,所述计算机可读存储介质中存储有至少一条计算机程序,所述至少一条计算机程序被处理器执行时能够实现如权利要求1至12中任一项所述的半结构化数据的处理方法。
CN202310269778.1A 2023-03-13 2023-03-13 半结构化数据的处理方法、电子设备及存储介质 Pending CN116521941A (zh)

Priority Applications (1)

Application Number Priority Date Filing Date Title
CN202310269778.1A CN116521941A (zh) 2023-03-13 2023-03-13 半结构化数据的处理方法、电子设备及存储介质

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CN202310269778.1A CN116521941A (zh) 2023-03-13 2023-03-13 半结构化数据的处理方法、电子设备及存储介质

Publications (1)

Publication Number Publication Date
CN116521941A true CN116521941A (zh) 2023-08-01

Family

ID=87401946

Family Applications (1)

Application Number Title Priority Date Filing Date
CN202310269778.1A Pending CN116521941A (zh) 2023-03-13 2023-03-13 半结构化数据的处理方法、电子设备及存储介质

Country Status (1)

Country Link
CN (1) CN116521941A (zh)

Similar Documents

Publication Publication Date Title
CN110291517B (zh) 图数据库中的查询语言互操作性
US7464083B2 (en) Combining multi-dimensional data sources using database operations
US8943059B2 (en) Systems and methods for merging source records in accordance with survivorship rules
US8086592B2 (en) Apparatus and method for associating unstructured text with structured data
US10380269B2 (en) Sideways information passing
US11941034B2 (en) Conversational database analysis
US9747349B2 (en) System and method for distributing queries to a group of databases and expediting data access
US20110087708A1 (en) Business object based operational reporting and analysis
CN106294695A (zh) 一种面向实时大数据搜索引擎的实现方法
US20100235344A1 (en) Mechanism for utilizing partitioning pruning techniques for xml indexes
US11675769B2 (en) On-demand, dynamic and optimized indexing in natural language processing
US20220391367A1 (en) Efficient Indexing for Querying Arrays in Databases
Vajk et al. Automatic NoSQL schema development: A case study
US11630829B1 (en) Augmenting search results based on relevancy and utility
US20190340272A1 (en) Systems and related methods for updating attributes of nodes and links in a hierarchical data structure
KR101955376B1 (ko) 비공유 아키텍처 기반의 분산 스트림 처리 엔진에서 관계형 질의를 처리하는 방법, 이를 수행하기 위한 기록 매체 및 장치
Bok et al. Provenance compression scheme based on graph patterns for large RDF documents
US20230153455A1 (en) Query-based database redaction
US11868362B1 (en) Metadata extraction from big data sources
US10877998B2 (en) Highly atomized segmented and interrogatable data systems (HASIDS)
US20230141190A1 (en) Late Materialization of Queried Data in Database Cache
CN115048469A (zh) 数据查询方法、装置、电子设备及存储介质
CN116521941A (zh) 半结构化数据的处理方法、电子设备及存储介质
CN113868138A (zh) 测试数据的获取方法、系统、设备及存储介质
US10762084B2 (en) Distribute execution of user-defined function

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