一种JSON数据的语法树提取方法技术

技术编号:23891738 阅读:39 留言:0更新日期:2020-04-22 06:45
本发明专利技术提供一种JSON数据的语法树提取方法,包括:对给定的数据集中的JSON数据进行采样,记录JSON记录结构树;遍历所有的JSON记录结构树以累加生成一个统计结构树;遍历统计结构树中每个节点的计数器,将JSON记录中的域划分为稀疏域和非稀疏域;将特征相同的稀疏域归类到一起,形成相同特征的域的归类;基于非稀疏域、相同特征的域的归类生成语法树的初始状态:根据语法树的初始状态,对给定的数据集中的所有JSON记录逐条进行解析,动态构建数据集对应的语法树。本发明专利技术通过对JSON数据记录(Record)中的稀疏的域按照特征进行归类,提高了语法树的组织效率;通过对具有相同特征的域进行归类,减少了解析后的数据的列式文件数量,从而提高了在后续查询过程中的效率。

A syntax tree extraction method of JSON data

【技术实现步骤摘要】
一种JSON数据的语法树提取方法
本专利技术涉及数据处理方法,具体来说,涉及JSON数据存储与查询领域,更具体地说,涉及一种JSON数据的语法树(树状结构数据的元数据)提取方法,并基于此方法进行的数据处理方法、查询方法及系统。
技术介绍
随着计算机网络和大数据处理技术的发展,传统关系型数据已经越来越不能满足网络和大数据环境下对数据定义和使用的要求。而以JSON为代表的半结构化数据因为既能够充分的表达编程语言中对象(class),同时还能够根据数据的格式变化对原有的数据格式进行修改和扩充,故而其在实际环境中被广泛的使用。在传统的关系型数据库中,用户将记录导入到数据库之前需要预先以数据表的形式定义记录的元信息:例如表中有哪些属性,各属性分别是什么类型等。而在使用JSON数据时,不需要预先定义记录的元信息:用户在使用JSON数据前不需要预先定义数据集中记录的内部结构,包括域的名称、值的类型及相关的嵌套结构等。当用户的需求发生改变时,例如改变记录内部的结构、改变某一个域的类型等,记录的结构可以随时按照需求的变化进行相应的改变,不需要修改记录相关的数据元信息以及之前产生的记录的内部结构。这样,JSON数据为用户提供了足够强的语义的灵活性:用户不需要预先定义JSON数据的元信息;同时当需求发生变化时,用户可以随时修改JSON数据的内部结构。现阶段对JSON数据处理(包括数据解析、存储和查询等相关的操作)有以下的三种方式:方式一、不提取记录内部结构的元信息(即JSON数据中的数据结构),将其作为一个整体存储在相应的数据库中,例如PostgreSQL,Oracle,MongoDB等。具体的实现方式又分为以下2种:(a)、直接将JSON数据以原有的文本形式存储在数据库的表的某个域中,例如PostgreSQL等。(b)、将JSON数据按照一定的编码格式进行逐条记录的二进制编码,之后将记录作为一个整体进行存储。例如,在Oracle(FSDM,OSON)及PostgreSQL(jsonbdata)中,可以定义表中的某个域为JSON的二进制类型,之后在每条记录的这个域中存储一条经过编码的JSON记录;在MongoDB中,其将每条JSON数据解析并编码为一条二进制的BSON数据,进而独立的存储为一个完整的数据集。方式二、由用户预先定义相应树状结构的JSON元数据,再按照一定的形式进行数据的组织和编码。具体的实现方式又分为以下2种:(a)、树状结构数据拆分为若干张关系型数据库表的形式或者部分拆分为表的形式。例如Argo[EnablingJSONDocumentStoresinRelationalSystems],用户需要按照表的形式将JSON等树状结构数据拆分成为具体键值对(Key:Value)形式的域进行存储。(b)、树状结构数据按照用户的预定义定义为语法树的形式。例如GoogleProtocols,ApacheParquet等,用户首先将树状结构的数据的内部结构定义为语法树的形式,进而由树状结构数据处理系统按照其对应的语法树对数据进行解析、存储和查询等相应的操作。方式三、树状结构数据处理系统在数据解析过程中,动态生成相应的使用树状结构语法树表示的元信息进行JSON数据内部结构的定义。例如Steed,在树状结构数据解析的过程中,将记录中出现的每个域自动推导为语法树中的一个节点。对于语法树中的每个叶子节点,将其数据使用列式结构(语法树中从根到叶子节点的路径都单独存储为一个独立的文件)存储到对应的列式文件中。每个列文件的内部可以按照该列的数据类型、列上数据在单条JSON数据中出现的次数等特点进行相应的存储优化。在查询过程中,可以仅读取和查询相关的列进而提高了树状结构数据处理系统的查询效率。而当树状结构数据的内部结构发生改变时,其可以在语法树中动态的增加节点,进而实现了对JSON数据内部结构发生改变时的动态支持。但是针对上述的三种处理方式,也都存在各自的缺陷,具体如下:针对方式一:若不提取对应的语法树而直接将每条JSON文本记录直接或编码后存储到相应的系统中。每条记录中都需要将其内部的结构存储在该记录中:数据集中存储了大量的关于域名及其嵌套关系的冗余信息,造成了存储效率的低下,进而会影响其进行查询时的I/O效率。若对数据进行相应的编码后再存储到数据库系统中,需要不断的对已经重复出现的结构进行相应的重复编码操作,这样会影响到数据导入到数据库系统的相关效率。而在查询阶段,数据库系统需要不断的从这些文本或编码后的数据中递归查找每一个查询相关的域直到找到相应的域或者完成相应的递归查找过程。这就造成了相应的查询效率较低。针对方式二:若用户在使用树状结构数据之前预先定义相应的存储结构时,则限制了JSON数据表达能力的灵活性:当用户在改变或者更新相应的数据内部结构时,同样也需要更新相应的语法定义。若将数据拆分为表的结构式,如果更新相应的JSON数据,则需要更新数据库中的表结构;同时,在查询过程中,数据需要在表中不断的进行连接操作(joinoperator)以表达其内部的嵌套结构,这样会导致极高的数据存储和查询代价。若将JSON定义为相应的语法树的形式,当其内部的记录的结构发生变化时,也需要更新相应的语法树定义。此外,当不同用户需要对数据的结构进行不同的修改时,需要在全局同步语法树中相应的修改。针对方式三:在动态推导JSON数据语法树时,其对数据内部的结构也有一些限制。首先,无法有效支持稀疏域。现有方法认为记录中每个键值对(Key:Value)中的键(Key)都是一个域的名字而非具体的属性值。例如,在存储学生信息时,我们可以从形如{“name”:“Zhangsan”,“age”:18}结构的数据中提取对应的语法树,树中包括name和age两个节点。这里要求大部分记录中都有name和age两个相同的节点。而对于形如{“Zhangsan”:18}结构的数据,数据中的域“Zhangsan”也存储了具体记录中的值的一部分信息,而这些值在整个数据集中不会频繁出现。当Steed按照数据中具体出现的域进行解析并生成JSON数据语法树中相应的节点时,产生大量的稀疏的节点,即记录中该节点所关联的记录是稀疏的(关联记录的数量极小)。存储这些稀疏的列进行时会产生大量的小文件,这些小文件存储的效率和使用其进行查询时的效率都会十分低下:列式文件中包含该列的结构信息,当使用列式文件存储稀疏的数据时,数据的存储效率不高;在进行查询时,需要在语法树(SchemaTree)和大量的小文件中查找到对应列式文件进行读取,这就造成了因打开大量小文件而产生的性能代价。其次,相同的键(Key)即JSON数据中的域的域名如果对应不同类型的值(Value)即域值,将造成解析错误。例如,在存储学生信息时,我们可以从形如{“age”:18},{“age”:“18”},{“age”:“eighteen”}结构的数据中提取对应的语法树。相同的键(Key)“age”对应了int,string等不同类型的值(Value),但是语法树中却只包括ag本文档来自技高网...

【技术保护点】
1.一种JSON数据的语法树提取方法,其特征在于,包括:/nS0、对给定的数据集中的JSON数据进行采样,获取预设采样规模的多条JSON记录;记录采样到的每一条JSON记录的内部结构对应的JSON记录结构树,其中,每一条JSON记录的每一个域与其对应JSON记录结构树中的一个节点关联;/nS1、遍历步骤S0中记录的所有的JSON记录结构树以累加生成一个统计结构树,并在统计结构树中的每一个节点设置一个计数器以记录该节点在所有JSON记录结构树中出现的总次数;/nS2、遍历统计结构树中每个节点的计数器,将计数器中记录的数值大于预设阈值的节点划分为非稀疏节点,与非稀疏节点关联的域为非稀疏域;将计数器记录的数值小于或等于预设阈值的节点划分为稀疏节点,与稀疏节点关联的域为稀疏域;/nS3、对域的特征进行识别,基于特征识别结果对稀疏域进行归类,特征识别结果相同的稀疏域归类到一起,形成相同特征的域的归类;/nS4、基于采样的JSON记录划分出的非稀疏域、相同特征的域的归类生成语法树的初始状态:/nS5、根据步骤S4生成的语法树的初始状态,对给定的数据集中的所有JSON记录逐条进行解析,动态更新数据集对应的语法树。/n...

【技术特征摘要】
1.一种JSON数据的语法树提取方法,其特征在于,包括:
S0、对给定的数据集中的JSON数据进行采样,获取预设采样规模的多条JSON记录;记录采样到的每一条JSON记录的内部结构对应的JSON记录结构树,其中,每一条JSON记录的每一个域与其对应JSON记录结构树中的一个节点关联;
S1、遍历步骤S0中记录的所有的JSON记录结构树以累加生成一个统计结构树,并在统计结构树中的每一个节点设置一个计数器以记录该节点在所有JSON记录结构树中出现的总次数;
S2、遍历统计结构树中每个节点的计数器,将计数器中记录的数值大于预设阈值的节点划分为非稀疏节点,与非稀疏节点关联的域为非稀疏域;将计数器记录的数值小于或等于预设阈值的节点划分为稀疏节点,与稀疏节点关联的域为稀疏域;
S3、对域的特征进行识别,基于特征识别结果对稀疏域进行归类,特征识别结果相同的稀疏域归类到一起,形成相同特征的域的归类;
S4、基于采样的JSON记录划分出的非稀疏域、相同特征的域的归类生成语法树的初始状态:
S5、根据步骤S4生成的语法树的初始状态,对给定的数据集中的所有JSON记录逐条进行解析,动态更新数据集对应的语法树。


2.根据权利要求1所述的一种JSON数据的语法树提取方法,其特征在于,所述步骤S0中记录采样到的每一条JSON记录的内部结构对应的JSON记录结构树包括如下操作:
对JSON记录中的域的嵌套关系进行解析,从最外层的域开始,在JSON记录结构树中记录最外层的域关联的节点;
以递归方式对具有嵌套关系的域自外而内,层层解析,在JSON记录结构树中记录每一层域关联的节点,直至解析到域的值为原子类型。


3.根据权利要求1所述的一种JSON数据的语法树提取方法,其特征在于,所述步骤S1中针对每一个JSON记录结构树,执行如下步骤:
S11、遍历JSON记录结构树中的每一个节点;
S12、针对遍历到的当前节点,查找统计结构树中是否存在与之相同的节点,若存在,则统计树中相同的节点对应的计数器加1;若不存在,则在统计结构树中产生一个与当前节点相同的节点并设置计数器。


4.根据权利要求1所述的一种JSON数据的语法树提取方法,其特征在于,将预设阈值设置为从数据集中采样得到的所有JSON记录中所有域的出现的总次数的80%。


5.根据权利要求1所述的一种JSON数据的语法树提取方法,其特征在于,域的特征包括域的嵌套关系、域名和域值的类型及单条JSON记录中域值出现的次数。


6.根据权利要求1所述的一种JSON数据的语法树提取方法,其特征在于,所述步骤S4包括:
对于非...

【专利技术属性】
技术研发人员:陈世敏王智义祁琦
申请(专利权)人:中国科学院计算技术研究所
类型:发明
国别省市:北京;11

网友询问留言 已有0条评论
  • 还没有人留言评论。发表了对其他浏览者有用的留言会获得科技券。

1