CN105989076B - 一种数据统计方法以及装置 - Google Patents

一种数据统计方法以及装置 Download PDF

Info

Publication number
CN105989076B
CN105989076B CN201510070951.0A CN201510070951A CN105989076B CN 105989076 B CN105989076 B CN 105989076B CN 201510070951 A CN201510070951 A CN 201510070951A CN 105989076 B CN105989076 B CN 105989076B
Authority
CN
China
Prior art keywords
dimension
value
line unit
target
achievement 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.)
Active
Application number
CN201510070951.0A
Other languages
English (en)
Other versions
CN105989076A (zh
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.)
Tencent Technology Shenzhen Co Ltd
Tencent Cloud Computing Beijing Co Ltd
Original Assignee
Tencent Technology Shenzhen 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 Tencent Technology Shenzhen Co Ltd filed Critical Tencent Technology Shenzhen Co Ltd
Priority to CN201510070951.0A priority Critical patent/CN105989076B/zh
Publication of CN105989076A publication Critical patent/CN105989076A/zh
Application granted granted Critical
Publication of CN105989076B publication Critical patent/CN105989076B/zh
Active legal-status Critical Current
Anticipated expiration legal-status Critical

Links

Landscapes

  • Information Retrieval, Db Structures And Fs Structures Therefor (AREA)

Abstract

本发明实施例公开了一种数据统计方法以及装置,其中方法包括:获取统计查询请求,在预设的维度索引表的列族中获取与所述统计查询请求所携带的查询维度值对应的目标维度值,并在所述维度索引表的行健中获取与所述目标维度值对应的第一目标行健值;在预设的指标数据存储表的行健中获取与所述第一目标行健值对应的第二目标行健值;将所述指标数据存储表的列族中与所述第二目标行健值对应的目标指标数据进行合并,以得到与所述统计查询请求对应的统计数据。采用本发明,可减少需要扫描的数据量,以提高对数据进行统计汇总的效率。

Description

一种数据统计方法以及装置
技术领域
本发明涉及计算机技术领域,尤其涉及一种数据统计方法以及装置。
背景技术
目前所设计的存储结构主要是扁平化的数据存储形式,即一条日志记录对应一行,各个字段值分别存储在对应列中。对目前的存储结构所存储的数据进行统计汇总的过程可以为:扫描每一行日志记录,并对满足条件的字段进行筛选,再将筛选出的字段所对应的数据进行统计汇总。由于需要扫描所有的日志记录,所以当存储的日志记录过多时,会大大增加需要扫描的数据量,降低了对数据进行统计汇总的效率。
发明内容
本发明实施例提供一种数据统计方法以及装置,可减少需要扫描的数据量,以提高对数据进行统计汇总的效率。
为了解决上述技术问题,本发明第一方面提供了一种数据统计方法,包括:
获取统计查询请求,在预设的维度索引表的列族中获取与所述统计查询请求所携带的查询维度值对应的目标维度值,并在所述维度索引表的行键中获取与所述目标维度值对应的第一目标行键值;
在预设的指标数据存储表的行键中获取与所述第一目标行键值对应的第二目标行键值;
将所述指标数据存储表的列族中与所述第二目标行键值对应的目标指标数据进行合并,以得到与所述统计查询请求对应的统计数据。
本发明第二方面提供了一种数据统计装置,包括:
第一获取模块,用于获取统计查询请求,在预设的维度索引表的列族中获取与所述统计查询请求所携带的查询维度值对应的目标维度值,并在所述维度索引表的行键中获取与所述目标维度值对应的第一目标行键值;
第二获取模块,用于在预设的指标数据存储表的行键中获取与所述第一目标行键值对应的第二目标行键值;
合并模块,用于将所述指标数据存储表的列族中与所述第二目标行键值对应的目标指标数据进行合并,以得到与所述统计查询请求对应的统计数据。
本发明实施例通过在维度索引表中获取与统计查询请求所携带的查询维度值对应的第一目标行键值,再在指标数据存储表中获取与第一目标行键值对应的第二目标行键值,可以将指标数据存储表中与第二目标行键值对应的目标指标数据进行合并,以得到统计数据。由于只需通过扫描维度索引表即可对指标数据存储表中的目标指标数据进行统计汇总,即无需对所有日志记录都进行扫描,所以可以减少需要扫描的数据量,以提高对数据进行统计汇总的效率。
附图说明
为了更清楚地说明本发明实施例或现有技术中的技术方案,下面将对实施例或现有技术描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本发明的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他的附图。
图1是本发明实施例提供的一种数据统计方法的流程示意图;
图2是本发明实施例提供的另一种数据统计方法的流程示意图;
图3是本发明实施例提供的一种数据更新方法的流程示意图;
图4是本发明实施例提供的一种数据统计装置的结构示意图;
图5是本发明实施例提供的另一种数据统计装置的结构示意图;
图6是本发明实施例提供的一种第一获取模块的结构示意图;
图7是本发明实施例提供的一种第二获取模块的结构示意图;
图8是本发明实施例提供的一种合并模块的结构示意图;
图9是本发明实施例提供的又一种数据统计装置的结构示意图。
具体实施方式
下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有作出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。
请参见图1,是本发明实施例提供的一种数据统计方法的流程示意图,所述方法可以包括:
S101,获取统计查询请求,在预设的维度索引表的列族中获取与所述统计查询请求所携带的查询维度值对应的目标维度值,并在所述维度索引表的行键中获取与所述目标维度值对应的第一目标行键值;
具体的,当数据统计装置接收到统计查询请求时,所述数据统计装置可以在预设的维度索引表的列族中获取与所述统计查询请求所携带的查询维度值对应的目标维度值,并在所述维度索引表的行键中获取与所述目标维度值对应的第一目标行键值。其中,所述维度索引表是基于HBase(Hadoop Database,Hadoop数据库)数据库所创建的,所述维度索引表的列族包括至少一个维度列名,所述至少一个维度列名中各维度列名分别对应至少一个维度值,所述维度索引表的行键包括至少一个第一行键值,所述至少一个第一行键值是根据所述至少一个维度值计算得到的。所述维度索引表的具体结构可以参见如下表1:
表1
其中,表1中的dimension1、…、dimensionM均为所述维度索引表的列族所包括的维度列名,每个维度列名均对应至少一个维度值,如为dimension1的维度列名对应的维度值包括Bytes_1、Bytes_2、…、Bytes_n;表1中的各个维度值均为日志记录中需要选择条件的字段,即在存储日志记录时将日志记录中需要选择条件的字段作为维度值以存储到所述维度索引表中;表1中的第一行键值包括xxx_hashcode_1、xxx_hashcode_2、…、xxx_hashcode_n,第一行键值中的hashcode_n为对维度值组合进行拼接后所计算出的哈希值;第一行键值中的xxx为hashcode_n的尾三位,由于HBase中表是以字典序存储,所以第一行键值中的xxx设计可使存储的数据分布更均匀,以提高写入和查询的并发度。其中hashcode_n的具体计算方法可以为:
hashcode_n=(dim[1]+"\t"+dim[2]+"\t"+...+dim[M).hashCode()其中,dim[1]代表dimension1这一列中的第n行的维度值,dim[2]代表dimension2这一列中的第n行的维度值,dim[M]代表dimensionM这一列中的第n行的维度值。以xxx_hashcode_1为例,hashcode_1的值是由与xxx_hashcode_1同一行的各个维度值进行拼接计算得到的。
以上述表1为例,若在表1中查找到Bytes_2与所述统计查询请求所携带的查询维度值相同,则可以确定Bytes_2为目标维度值,再在表1的行键中获取Bytes_2对应的第一目标行键值,所述第一目标行键值为xxx_hashcode_2。
S102,在预设的指标数据存储表的行键中获取与所述第一目标行键值对应的第二目标行键值;
具体的,在获取到所述第一目标行键值之后,所述数据统计装置可以在预设的指标数据存储表的行键中获取与所述第一目标行键值对应的第二目标行键值。其中,所述指标数据存储表是基于HBase数据库所创建的,所述指标数据存储表的列族包括至少一个指标列名,所述至少一个指标列名中各指标列名分别对应至少一个指标数据,所述指标数据存储表的行键包括至少一个第二行键值,所述至少一个第二行键值是根据所述至少一个维度值和时间值计算得到的,所述时间值是按照预设的时间粒度所划分的。所述指标数据存储表的具体结构可以参见如下表2:
表2
其中,表2中的列族所包括的指标列名包括:0000、0001、…、1023,每个指标列名对应至少一个指标数据,如为“0000”的指标列名所对应的指标数据包括:SliceIndex_1、SliceIndex_2、…、SliceIndex_n;表2中的各个指标数据为日志记录中的用于进行统计的数值,即在存储日志记录时将日志记录中的用于进行统计的数值作为指标数据以存储到所述指标数据存储表,所述指标数据是以Thrift结构序列化存储的,Thrift是一个软件框架且用来进行可扩展且跨语言的服务的开发,所述指标数据可以包括全局计数指标、估计用户数指标数组、计数指标、去重指标、合计指标、最大值指标、最小值指标以及平均值指标等等。表2中的第二行键值包括xxx_hashcode_1_time、xxx_hashcode_2_time、…、xxx_hashcode_n_time,其中,xxx_hashcode_n的结构与计算方式与第一行键值相同,这里不再进行赘述。第二行键值中的time为时间值,所述时间值是按照预设的时间粒度所划分的,若时间粒度为1个小时,则time可以划分为:0000、0100、0200、…、2300;若时间粒度为15分钟,则time可以划分为:0000、0015、0030、…、2345。例如,若以1个小时为时间粒度,则第二行键值可以包括xxx_hashcode_1_0100、xxx_hashcode_2_0200等等。
其中,所述统计查询请求还包括统计时间范围,在获取到第二目标行键值之前,需要先根据所述统计时间范围以及预设的时间粒度枚举时间值,若所述统计时间范围为全天且时间粒度为1个小时,则枚举得到的时间值包括0000、0100、0200、…、2300,再将获取到的所述第一目标行键值与所枚举的各个时间值拼接;若所述第一目标行键值为xxx_hashcode_2,则所述第一目标行键值与所枚举的各个时间值拼接后,可以得到待查询行键值:xxx_hashcode_2_0000、xxx_hashcode_2_0100、…、xxx_hashcode_2_2300;再在所述指标数据存储表中查找与多个待查询行键值中的任一个相同的第二行键值,并将查找出的第二行键值确定为第二目标行键值。
S103,将所述指标数据存储表的列族中与所述第二目标行键值对应的目标指标数据进行合并,以得到与所述统计查询请求对应的统计数据;
具体的,在获取到所述第二目标行键值之后,所述数据统计装置可以先将所述指标数据存储表的列族中与所述第二目标行键值对应的目标指标数据进行行合并,在行合并时可以从上至下依次进行两两合并,直至行合并到剩下一行目标指标数据,再将行合并后的目标指标数据进行列合并,在列合并时也可以依次进行两两合并,在列合并到剩下一列时即可得到与所述统计查询请求对应的统计数据。
本发明实施例通过在维度索引表中获取与统计查询请求所携带的查询维度值对应的第一目标行键值,再在指标数据存储表中获取与第一目标行键值对应的第二目标行键值,可以将指标数据存储表中与第二目标行键值对应的目标指标数据进行合并,以得到统计数据。由于日志记录中的维度值和指标数据分别存储于维度索引表和指标数据存储表中,且只需通过扫描维度索引表即可对指标数据存储表中的目标指标数据进行统计汇总,即无需对所有日志记录都进行扫描,所以可以减少需要扫描的数据量,以提高对数据进行统计汇总的效率。
请参见图2,是本发明实施例提供的另一种数据统计方法的流程示意图,所述方法可以包括:
S201,根据HBase数据库预设维度索引表和指标数据存储表;
具体的,数据统计装置可以根据HBase数据库预设维度索引表和指标数据存储表。将日志记录中需要选择条件的字段定义为维度值,并将日志记录中用于进行统计的数值定义为指标数据。所述数据统计装置将维度值存储于所述维度索引表的列族中,将指标数据存储于所述指标数据存储表的列族中。
其中,所述维度索引表的列族包括至少一个维度列名,所述至少一个维度列名中各维度列名分别对应至少一个维度值,所述维度索引表的行键包括至少一个第一行键值,所述至少一个第一行键值是根据所述至少一个维度值计算得到的。所述指标数据存储表的列族包括至少一个指标列名,所述至少一个指标列名中各指标列名分别对应至少一个指标数据,所述指标数据存储表的行键包括至少一个第二行键值,所述至少一个第二行键值是根据所述至少一个维度值和时间值计算得到的,所述时间值是按照预设的时间粒度所划分的。
所述维度索引表的具体结构可以参见图1对应实施例中的表1,表1中的dimension1、…、dimensionM均为所述维度索引表的列族所包括的维度列名,每个维度列名均对应至少一个维度值,如为dimension1的维度列名对应的维度值包括Bytes_1、Bytes_2、…、Bytes_n;表1中的各个维度值均为日志记录中需要选择条件的字段,即在存储日志记录时将日志记录中需要选择条件的字段作为维度值以存储到所述维度索引表中;表1中的第一行键值包括xxx_hashcode_1、xxx_hashcode_2、…、xxx_hashcode_n,第一行键值中的hashcode_n为对维度值组合进行拼接后所计算出的哈希值;第一行键值中的xxx为hashcode_n的尾三位,由于HBase中表是以字典序存储,所以第一行键值中的xxx设计可使存储的数据分布更均匀,以提高写入和查询的并发度。其中hashcode_n的具体计算方法可以为:
hashcode_n=(dim[1]+"\t"+dim[2]+"\t"+...+dim[M]).hashCode()其中,dim[1]代表dimension1这一列中的第n行的维度值,dim[2]代表dimension2这一列中的第n行的维度值,dim[M]代表dimensionM这一列中的第n行的维度值。以xxx_hashcode_1为例,hashcode_1的值是由与xxx_hashcode_1同一行的各个维度值进行拼接计算得到的。
所述指标数据存储表的具体结构可以参见图1对应实施例中的表2,表2中的列族所包括的指标列名包括:0000、0001、…、1023,每个指标列名对应至少一个指标数据,如为“0000”的指标列名所对应的指标数据包括:SliceIndex_1、SliceIndex_2、…、SliceIndex_n;表2中的各个指标数据为日志记录中的用于进行统计的数值,即在存储日志记录时将日志记录中的用于进行统计的数值作为指标数据以存储到所述指标数据存储表,所述指标数据是以Thrift结构序列化存储的,所述指标数据可以包括用户数、次数、去重值、计数值、合计值、最大值、最小值、平均值等等。表2中的第二行键值包括xxx_hashcode_1_time、xxx_hashcode_2_time、…、xxx_hashcode_n_time,其中,xxx_hashcode_n的结构与计算方式与第一行键值相同,这里不再进行赘述。第二行键值中的time为时间值,所述时间值是按照预设的时间粒度所划分的,若时间粒度为1个小时,则time可以划分为:0000、0100、0200、…、2300;若时间粒度为15分钟,则time可以划分为:0000、0015、0030、…、2345。例如,若以1个小时为时间粒度,则第二行键值可以包括xxx_hashcode_1_0100、xxx_hashcode_2_0200等等。
S202,获取统计查询请求,所述统计查询请求携带有查询维度值;
具体的,当所述数据统计装置接收到统计查询请求时,可以获取所述统计查询请求所携带的查询维度值。
S203,在所述维度索引表中的所述至少一个维度值中获取与所述查询维度值对应的维度值,并将与所述查询维度值对应的维度值确定为目标维度值;
具体的,所述数据统计装置获取到查询维度值之后,可以在所述维度索引表中的所述至少一个维度值中获取与所述查询维度值对应的维度值,并将与所述查询维度值对应的维度值确定为目标维度值。以上述图1对应实施例中的表1为例,查询维度值包括维度值A和维度值B,若在表1的列族中查找到与维度值A相同的维度值为Bytes_1,与维度值B相同的维度值为Bytes_2,则将Bytes_1和Bytes_2确定为目标维度值。
S204,在所述维度索引表中的所述至少一个第一行键值中获取与所述目标维度值对应的第一行键值,并将与所述目标维度值对应的第一行键值确定为第一目标行键值;
具体的,所述数据统计装置确定出目标维度值之后,可以在所述维度索引表中的所述至少一个第一行键值中获取与所述目标维度值对应的第一行键值,并将与所述目标维度值对应的第一行键值确定为第一目标行键值。再以上述表1为例,若确定出的目标维度值为Bytes_1和Bytes_2,则可以在表1的行键中获取到与Bytes_1对应的第一行键值为xxx_hashcode_1,以及Bytes_2对应的第一行键值为xxx_hashcode_2,并将xxx_hashcode_1和xxx_hashcode_2确定为第一目标行键值。
S205,根据所述时间粒度和所述统计查询请求所携带的统计时间范围,生成在所述统计时间范围内的至少一个目标时间值;
具体的,所述统计查询请求还包括统计时间范围。所述数据统计装置确定出第一目标行键值之后,可以根据所述时间粒度和所述统计查询请求所携带的统计时间范围,生成在所述统计时间范围内的至少一个目标时间值。例如,若统计时间范围为全天,且预设的时间粒度为1个小时,则所生成的目标时间值包括0000、0100、0200、…、2300,即0:00到23:00的时间值。
S206,将所述至少一个目标时间值中各目标时间值分别与所述第一目标行键值进行拼接,以得到待查询行键值;
具体的,所述数据统计装置生成至少一个目标时间值之后,可以将所述至少一个目标时间值中各目标时间值分别与所述第一目标行键值进行拼接,以得到待查询行键值。例如,若所述统计时间范围为全天且时间粒度为1个小时,且所述第一目标行键值为xxx_hashcode_2,则所述至少一个目标时间值包括0000、0100、0200、…、2300,再将xxx_hashcode_2分别与所述至少一个目标时间值中各目标时间值进行拼接,可以得到待查询行键值,所述待查询行键值包括:xxx_hashcode_2_0000、xxx_hashcode_2_0100、…、xxx_hashcode_2_2300。
S207,在所述指标数据存储表中的所述至少一个第二行键值中获取与所述待查询行键值对应的第二行键值,并将与所述待查询行键值对应的第二行键值确定为第二目标行键值;
具体的,所述数据统计装置得到待查询行键值之后,可以在所述指标数据存储表中的所述至少一个第二行键值中获取与所述待查询行键值对应的第二行键值,并将与所述待查询行键值对应的第二行键值确定为第二目标行键值。例如,所述待查询行键值包括:xxx_hashcode_2_0000、xxx_hashcode_2_0100、…、xxx_hashcode_2_2300,在所述指标数据存储表中查找是否存在与所述待查询行键值相同的第二行键值,若在所述指标数据存储表中查找到与所述待查询行键值相同的第二行键值包括xxx_hashcode_2_0000和xxx_hashcode_2_0100,则将所述指标数据存储表中的xxx_hashcode_2_0000和xxx_hashcode_2_0100确定为第二目标行键值。
S208,在所述指标数据存储表中的所述至少一个指标数据中获取与所述第二目标行键值对应的指标数据,并将与所述第二目标行键值对应的指标数据确定为目标指标数据;
具体的,所述数据统计装置确定出第二目标行键值之后,可以在所述指标数据存储表中的所述至少一个指标数据中获取与所述第二目标行键值对应的指标数据,并将与所述第二目标行键值对应的指标数据确定为目标指标数据。以上述图1对应实施例中的表2为例,若所述第二目标行键值包括:xxx_hashcode_1_time和xxx_hashcode_2_time,则与xxx_hashcode_1_time同一行的各列指标数据均为目标指标数据,且与xxx_hashcode_2_time同一行的各列指标数据也均为目标指标数据。
S209,将所述目标指标数据进行行合并,并将行合并后的目标指标数据进行列合并,以得到与所述统计查询请求对应的统计数据;
具体的,所述数据统计装置确定出目标指标数据之后,可以先将所述目标指标数据进行行合并,在行合并时可以从上至下分别对每列的目标指标数据依次进行两两合并,直至行合并到剩下一行目标指标数据。再请参见上述图1对应实施例中的表2,以SliceIndex_1和SliceIndex_2进行行合并为例,若SliceIndex_1和SliceIndex_2均包括全局计数指标、估计用户数指标数组、计数指标、去重指标、合计指标、最大值指标、最小值指标以及平均值指标,则对SliceIndex_1和SliceIndex_2进行行合并的具体过程包括:
全局计数指标的合并:sliceIndex1.countTotal+sliceIndex2.countTotal;
估计用户数指标数组的合并:
计数指标的合并:sliceIndex1.countIndex+sliceIndex2.countIndex;
去重指标的合并:sliceIndex1.distincts.addAll(sliceIndex2.distincts)(集合合并);
合计指标的合并:sliceIndex1.sum+sliceIndex2.sum;
最小值指标的合并:Min(sliceIndex1.min,sliceIndex2.min);
最小值指标的合并:Max(sliceIndex1.max,sliceIndex2.max);
平均值指标的合并:
(sliceIndex1.avg*sliceIndex1.countIndex1+sliceIndex2.avg*sliceIndex2.countIndex2)/(sliceIndex1.countIndex1+sliceIndex2.countIndex2)。
其中,对行合并后的目标指标数据进行列合并的过程与行合并的过程类似,即在列合并时可以对各列中行合并后的目标指标数据依次进行两两合并,直至列合并到剩下一个总的目标指标数据,所述总的目标指标数据即为与所述统计查询请求对应的统计数据。其中,列合并和行合并不一样的地方仅在于对估计用户数指标数组的合并,在列合并之前需要先根据各列中行合并后的估计用户数指标数组这个变量计算出一个用户数数值,再在列合并时直接累加各列计算出的用户数数值即可统计出某种维度条件下查询的估计用户数这个指标值的总量,对于其他指标的列合并的过程与行合并的过程相同。其中,根据估计用户数指标数组这个变量计算出一个用户数数值的具体过程可以为:
其中,userCount为计算出的用户数数值。
本发明实施例通过在维度索引表中获取与统计查询请求所携带的查询维度值对应的第一目标行键值,再在指标数据存储表中获取与第一目标行键值对应的第二目标行键值,可以将指标数据存储表中与第二目标行键值对应的目标指标数据进行合并,以得到统计数据。由于日志记录中的维度值和指标数据分别存储于维度索引表和指标数据存储表中,且只需通过扫描维度索引表即可对指标数据存储表中的目标指标数据进行统计汇总,即无需对所有日志记录都进行扫描,所以可以减少需要扫描的数据量,以提高对数据进行统计汇总的效率。
请参见图3,是本发明实施例提供的一种数据更新方法的流程示意图,所述方法可以包括:
S301,当获取到日志记录信息时,提取所述日志记录信息中的日志指标数据、日志维度值、时间信息以及关键字段;
具体的,在S301步骤之前,先预设维度索引表和指标数据存储表,预设维度索引表和指标数据存储表的具体实现方式可以参见上述图2对应实施例中的S201,这里不再进行赘述。S301步骤可以在上述图1对应实施例中的S101-S103步骤中的任一时刻执行,或可以在上述图2对应实施例中的S202-S209步骤中的任一时刻执行。
当所述数据统计装置获取到日志记录信息时,可以提取所述日志记录信息中的日志指标数据、日志维度值、时间信息以及关键字段。其中,所述日志指标数据可以包括全局计数指标、估计用户数指标数组、计数指标、去重指标、合计指标、最大值指标、最小值指标以及平均值指标中的至少一种。所述时间信息为生成所述日志记录信息的时间点。
S302,根据所述日志维度值生成第一待更新行键值,并根据所述日志维度值对所述维度索引表中与所述第一待更新行键值对应的各个维度值进行更新;
具体的,所述数据统计装置提取出日志指标数据、日志维度值、时间信息以及关键字段之后,可以将所述日志维度值放入dim数组,计算出该dim数组拼接的hashcode_n,以得到对应的第一待更新行键值xxx_hashcode_n,xxx为hashcode_n的尾三位,所述hashcode_n的具体计算方法可以为:
hashcode_n=(dim[1]+"\t"+dim[2]+"\t"+...+dim[M]).hashCode();以上述图1对应实施例中的表1为例,hashcode_n的计算公式中的dim[1]代表dimension1这一列中的第n行的维度值,dim[2]代表dimension2这一列中的第n行的维度值,dim[M]代表dimensionM这一列中的第n行的维度值。再以xxx_hashcode_1为例,hashcode_1的值是由与xxx_hashcode_1同一行的各个维度值进行拼接计算得到的。若所生成的第一待更新行键值为xxx_hashcode_1,则将各个日志维度值分别写入表1中与xxx_hashcode_1同一行的各个维度值中,以完成对与所述第一待更新行键值对应的各个维度值进行更新的操作,其中,由于各个日志维度值与xxx_hashcode_1同一行的各个维度值相同,所以写入各个日志维度值的过程即为对与xxx_hashcode_1同一行的各个维度值进行再次覆盖,或者,也可以无需对与xxx_hashcode_1同一行的各个维度值进行更新操作。
可选地,若无法在所述维度索引表中查找到所述第一待更新行键值,则可以在所述维度索引表中新增一行,以将所述第一待更新行键值以及各个日志维度值写入新增的行中。
S303,根据所述日志维度值和所述时间信息生成第二待更新行键值,并根据所述关键字段生成待更新指标列名,并根据所述日志指标数据对所述指标数据存储表中与所述第二待更新行键值和所述待更新指标列名对应的指标数据进行更新;
具体的,S303步骤可以和S302步骤同步进行。所述数据统计装置可以根据所述日志维度值生成xxx_hashcode_n,再根据时间信息以及预设的时间粒度生成time,将xxx_hashcode_n与time进行拼接即可得到第二待更新行键值xxx_hashcode_n_time。再根据所述关键字段生成待更新指标列名,生成待更新指标列名的具体过程为:计算所述关键字段的murmur哈希值(64为整型值),向右移位48位后除以64即可得到待更新指标列名(0000~1023),即计算待更新指标列名的方法为:(murmurhash(key)>>48)/64。在生成第二待更新行键值和待更新指标列名之后,可以根据所述日志指标数据对所述指标数据存储表中与所述第二待更新行键值和所述待更新指标列名对应的指标数据进行更新。以上述图1对应实施例中的表2为例,若所述第二待更新行键值为xxx_hashcode_1_time,所述待更新指标列名为0000,则可以根据所述日志指标数据对SliceIndex_1进行更新;其中,对SliceIndex_1进行更新的过程可以包括:对全局计数指标countTotal的更新:countTotal+1;
对估计用户数指标数组buckets的更新:
p=(murmurhash(key)>>48)%64
zeroNum=(murmurhash(key)<<16)的前导零个数
if(buckets.get(p)<zeroNum)then bucket.set(p,zeroNum);
若更新的指标为计数指标的第i个:countIndex.get(i)+1;
若更新的指标为去重指标的第i个:distincts.get(i).set(v);
若更新的指标为合计指标的第i个:sum.get(i)+v;
若更新的指标为最小值指标的第i个:Min(min.get(i),v);
若更新的指标为最大值指标的第i个:Max(max.get(i),v);
若更新的指标为平均值指标的第i个:(avg.get(i)*(countTotal.get(i)-1)+v)/countTotal.get(i)。
可选地,若无法在所述指标数据存储表中查找到第二待更新行键值,则可以在所述指标数据存储表中新增一行,以将所述第二待更新行键值写入新增的行中,并在该新增的行中且与所述待更新指标列名对应的位置处写入所述日志指标数据。
本发明实施例通过提取所述日志记录信息中的日志指标数据、日志维度值、时间信息以及关键字段,可以对维度索引表中对应的维度值进行更新并对指标数据存储表中对应的指标数据进行更新,由于写入日志记录信息时可以只更新相应位置的维度值和指标数据,即可以避免每写入一条日志记录信息就要增加一条行数,所以有效减少了存储开销;同时,通过更新维度值和指标数据的方式来写入日志记录信息,也可以在统计查询时降低所需扫描的数据量,以进一步提高对数据进行统计汇总的效率。
请参见图4,是本发明实施例提供的一种数据统计装置的结构示意图,所述数据统计装置1可以包括:第一获取模块10、第二获取模块20、合并模块30;
所述第一获取模块10,用于获取统计查询请求,在预设的维度索引表的列族中获取与所述统计查询请求所携带的查询维度值对应的目标维度值,并在所述维度索引表的行键中获取与所述目标维度值对应的第一目标行键值;
具体的,当数据统计装置1接收到统计查询请求时,所述第一获取模块10可以在预设的维度索引表的列族中获取与所述统计查询请求所携带的查询维度值对应的目标维度值,并在所述维度索引表的行键中获取与所述目标维度值对应的第一目标行键值。其中,所述维度索引表是基于HBase数据库所创建的,所述维度索引表的列族包括至少一个维度列名,所述至少一个维度列名中各维度列名分别对应至少一个维度值,所述维度索引表的行键包括至少一个第一行键值,所述至少一个第一行键值是根据所述至少一个维度值计算得到的。再请参见上述图1对应实施例中的表1,表1为所述维度索引表的具体结构,表1中的dimension1、…、dimensionM均为所述维度索引表的列族所包括的维度列名,每个维度列名均对应至少一个维度值,如为dimension1的维度列名对应的维度值包括Bytes_1、Bytes_2、…、Bytes_n;表1中的各个维度值均为日志记录中需要选择条件的字段,即在存储日志记录时将日志记录中需要选择条件的字段作为维度值以存储到所述维度索引表中;表1中的第一行键值包括xxx_hashcode_1、xxx_hashcode_2、…、xxx_hashcode_n,第一行键值中的hashcode_n为对维度值组合进行拼接后所计算出的哈希值;第一行键值中的xxx为hashcode_n的尾三位,由于HBase中表是以字典序存储,所以第一行键值中的xxx设计可使存储的数据分布更均匀,以提高写入和查询的并发度。其中hashcode_n的具体计算方法可以为:
hashcode_n=(dim[1]+"\t"+dim[2]+"\t"+...+dim[M]).hashCode()其中,dim[1]代表dimension1这一列中的第n行的维度值,dim[2]代表dimension2这一列中的第n行的维度值,dim[M]代表dimensionM这一列中的第n行的维度值。以xxx_hashcode_1为例,hashcode_1的值是由与xxx_hashcode_1同一行的各个维度值进行拼接计算得到的。
以上述表1为例,若在表1中查找到Bytes_2与所述统计查询请求所携带的查询维度值相同,则所述第一获取模块10可以确定Bytes_2为目标维度值,所述第一获取模块10再在表1的行键中获取Bytes_2对应的第一目标行键值,所述第一目标行键值为xxx_hashcode_2。
所述第二获取模块20,用于在预设的指标数据存储表的行键中获取与所述第一目标行键值对应的第二目标行键值;
具体的,在所述第一获取模块10获取到所述第一目标行键值之后,所述第二获取模块20可以在预设的指标数据存储表的行键中获取与所述第一目标行键值对应的第二目标行键值。其中,所述指标数据存储表是基于HBase数据库所创建的,所述指标数据存储表的列族包括至少一个指标列名,所述至少一个指标列名中各指标列名分别对应至少一个指标数据,所述指标数据存储表的行键包括至少一个第二行键值,所述至少一个第二行键值是根据所述至少一个维度值和时间值计算得到的,所述时间值是按照预设的时间粒度所划分的。所述指标数据存储表的具体结构可以参见上述图1对应实施例中的表2,其中,表2中的列族所包括的指标列名包括:0000、0001、…、1023,每个指标列名对应至少一个指标数据,如为“0000”的指标列名所对应的指标数据包括:SliceIndex_1、SliceIndex_2、…、SliceIndex_n;表2中的各个指标数据为日志记录中的用于进行统计的数值,即在存储日志记录时将日志记录中的用于进行统计的数值作为指标数据以存储到所述指标数据存储表,所述指标数据是以Thrift结构序列化存储的,Thrift是一个软件框架且用来进行可扩展且跨语言的服务的开发,所述指标数据可以包括全局计数指标、估计用户数指标数组、计数指标、去重指标、合计指标、最大值指标、最小值指标以及平均值指标等等。表2中的第二行键值包括xxx_hashcode_1_time、xxx_hashcode_2_time、…、xxx_hashcode_n_time,其中,xxx_hashcode_n的结构与计算方式与第一行键值相同,这里不再进行赘述。第二行键值中的time为时间值,所述时间值是按照预设的时间粒度所划分的,若时间粒度为1个小时,则time可以划分为:0000、0100、0200、…、2300;若时间粒度为15分钟,则time可以划分为:0000、0015、0030、…、2345。例如,若以1个小时为时间粒度,则第二行键值可以包括xxx_hashcode_1_0100、xxx_hashcode_2_0200等等。
其中,所述统计查询请求还包括统计时间范围,所述第二获取模块20在获取到第二目标行键值之前,需要先根据所述统计时间范围以及预设的时间粒度枚举时间值,若所述统计时间范围为全天且时间粒度为1个小时,则所述第二获取模块20枚举得到的时间值包括0000、0100、0200、…、2300,再将获取到的所述第一目标行键值与所枚举的各个时间值拼接;若所述第一目标行键值为xxx_hashcode_2,则所述第二获取模块20所述第一目标行键值与所枚举的各个时间值拼接后,可以得到待查询行键值:xxx_hashcode_2_0000、xxx_hashcode_2_0100、…、xxx_hashcode_2_2300;所述第二获取模块20再在所述指标数据存储表中查找与多个待查询行键值中的任一个相同的第二行键值,并将查找出的第二行键值确定为第二目标行键值。
所述合并模块30,用于将所述指标数据存储表的列族中与所述第二目标行键值对应的目标指标数据进行合并,以得到与所述统计查询请求对应的统计数据;
具体的,在所述第二获取模块20获取到所述第二目标行键值之后,所述合并模块30可以先将所述指标数据存储表的列族中与所述第二目标行键值对应的目标指标数据进行行合并,在行合并时可以从上至下依次进行两两合并,直至行合并到剩下一行目标指标数据,再将行合并后的目标指标数据进行列合并,在列合并时也可以依次进行两两合并,在列合并到剩下一列时即可得到与所述统计查询请求对应的统计数据。
本发明实施例通过在维度索引表中获取与统计查询请求所携带的查询维度值对应的第一目标行键值,再在指标数据存储表中获取与第一目标行键值对应的第二目标行键值,可以将指标数据存储表中与第二目标行键值对应的目标指标数据进行合并,以得到统计数据。由于日志记录中的维度值和指标数据分别存储于维度索引表和指标数据存储表中,且只需通过扫描维度索引表即可对指标数据存储表中的目标指标数据进行统计汇总,即无需对所有日志记录都进行扫描,所以可以减少需要扫描的数据量,以提高对数据进行统计汇总的效率。
再请参见图5,是本发明实施例提供的另一种数据统计装置的结构示意图,所述数据统计装置1可以包括上述图4对应实施例中的第一获取模块10、第二获取模块20、合并模块30,进一步的,所述数据统计装置1还可以包括:预设模块40、信息提取模块50、第一更新模块60、第二更新模块70;
所述预设模块40,用于根据HBase数据库预设维度索引表和指标数据存储表;
具体的,所述预设模块40可以根据HBase数据库预设维度索引表和指标数据存储表。将日志记录中需要选择条件的字段定义为维度值,并将日志记录中用于进行统计的数值定义为指标数据。所述数据统计装置1将维度值存储于所述维度索引表的列族中,将指标数据存储于所述指标数据存储表的列族中。
其中,所述维度索引表的列族包括至少一个维度列名,所述至少一个维度列名中各维度列名分别对应至少一个维度值,所述维度索引表的行键包括至少一个第一行键值,所述至少一个第一行键值是根据所述至少一个维度值计算得到的。所述指标数据存储表的列族包括至少一个指标列名,所述至少一个指标列名中各指标列名分别对应至少一个指标数据,所述指标数据存储表的行键包括至少一个第二行键值,所述至少一个第二行键值是根据所述至少一个维度值和时间值计算得到的,所述时间值是按照预设的时间粒度所划分的。
所述维度索引表的具体结构可以参见图1对应实施例中的表1,表1中的dimension1、…、dimensionM均为所述维度索引表的列族所包括的维度列名,每个维度列名均对应至少一个维度值,如为dimension1的维度列名对应的维度值包括Bytes_1、Bytes_2、…、Bytes_n;表1中的各个维度值均为日志记录中需要选择条件的字段,即在存储日志记录时将日志记录中需要选择条件的字段作为维度值以存储到所述维度索引表中;表1中的第一行键值包括xxx_hashcode_1、xxx_hashcode_2、…、xxx_hashcode_n,第一行键值中的hashcode_n为对维度值组合进行拼接后所计算出的哈希值;第一行键值中的xxx为hashcode_n的尾三位,由于HBase中表是以字典序存储,所以第一行键值中的xxx设计可使存储的数据分布更均匀,以提高写入和查询的并发度。其中hashcode_n的具体计算方法可以为:
hashcode_n=(dim[1]+"\t"+dim[2]+"\t"+...+dim[M]).hashCode()
其中,dim[1]代表dimension1这一列中的第n行的维度值,dim[2]代表dimension2这一列中的第n行的维度值,dim[M]代表dimensionM这一列中的第n行的维度值。以xxx_hashcode_1为例,hashcode_1的值是由与xxx_hashcode_1同一行的各个维度值进行拼接计算得到的。
所述指标数据存储表的具体结构可以参见图1对应实施例中的表2,表2中的列族所包括的指标列名包括:0000、0001、…、1023,每个指标列名对应至少一个指标数据,如为“0000”的指标列名所对应的指标数据包括:SliceIndex_1、SliceIndex_2、…、SliceIndex_n;表2中的各个指标数据为日志记录中的用于进行统计的数值,即在存储日志记录时将日志记录中的用于进行统计的数值作为指标数据以存储到所述指标数据存储表,所述指标数据是以Thrift结构序列化存储的,所述指标数据可以包括用户数、次数、去重值、计数值、合计值、最大值、最小值、平均值等等。表2中的第二行键值包括xxx_hashcode_1_time、xxx_hashcode_2_time、…、xxx_hashcode_n_time,其中,xxx_hashcode_n的结构与计算方式与第一行键值相同,这里不再进行赘述。第二行键值中的time为时间值,所述时间值是按照预设的时间粒度所划分的,若时间粒度为1个小时,则time可以划分为:0000、0100、0200、…、2300;若时间粒度为15分钟,则time可以划分为:0000、0015、0030、…、2345。例如,若以1个小时为时间粒度,则第二行键值可以包括xxx_hashcode_1_0100、xxx_hashcode_2_0200等等。
所述信息提取模块50,用于当获取到日志记录信息时,提取所述日志记录信息中的日志指标数据、日志维度值、时间信息以及关键字段;
具体的,当所述信息提取模块50获取到日志记录信息时,所述信息提取模块50可以提取所述日志记录信息中的日志指标数据、日志维度值、时间信息以及关键字段。其中,所述日志指标数据可以包括全局计数指标、估计用户数指标数组、计数指标、去重指标、合计指标、最大值指标、最小值指标以及平均值指标中的至少一种。所述时间信息为生成所述日志记录信息的时间点。
所述第一更新模块60,用于根据所述日志维度值生成第一待更新行键值,并根据所述日志维度值对所述维度索引表中与所述第一待更新行键值对应的各个维度值进行更新;
具体的,所述信息提取模块50提取出日志指标数据、日志维度值、时间信息以及关键字段之后,所述第一更新模块60可以将所述日志维度值放入dim数组,计算出该dim数组拼接的hashcode_n,以得到对应的第一待更新行键值xxx_hashcode_n,xxx为hashcode_n的尾三位,所述hashcode_n的具体计算方法可以为:
hashcode_n=(dim[1]+"\t"+dim[2]+"\t"+...+dim[M]).hashCode();
以上述图1对应实施例中的表1为例,hashcode_n的计算公式中的dim[1]代表dimension1这一列中的第n行的维度值,dim[2]代表dimension2这一列中的第n行的维度值,dim[M]代表dimensionM这一列中的第n行的维度值。若所述第一更新模块60所生成的第一待更新行键值为xxx_hashcode_1,则所述第一更新模块60将各个日志维度值分别写入表1中与xxx_hashcode_1同一行的各个维度值中,以完成对与所述第一待更新行键值对应的各个维度值进行更新的操作,其中,由于各个日志维度值与xxx_hashcode_1同一行的各个维度值相同,所以写入各个日志维度值的过程即为对与xxx_hashcode_1同一行的各个维度值进行再次覆盖,或者,也可以无需对与xxx_hashcode_1同一行的各个维度值进行更新操作。
可选地,若无法在所述维度索引表中查找到所述第一待更新行键值,则所述第一更新模块60可以在所述维度索引表中新增一行,以将所述第一待更新行键值以及各个日志维度值写入新增的行中。
所述第二更新模块70,用于根据所述日志维度值和所述时间信息生成第二待更新行键值,并根据所述关键字段生成待更新指标列名,并根据所述日志指标数据对所述指标数据存储表中与所述第二待更新行键值和所述待更新指标列名对应的指标数据进行更新;
具体的,所述第二更新模块70可以根据所述日志维度值生成xxx_hashcode_n,再根据时间信息以及预设的时间粒度生成time,将xxx_hashcode_n与time进行拼接即可得到第二待更新行键值xxx_hashcode_n_time。所述第二更新模块70再根据所述关键字段生成待更新指标列名,生成待更新指标列名的具体过程为:计算所述关键字段的murmur哈希值(64为整型值),向右移位48位后除以64即可得到待更新指标列名(0000~1023),即计算待更新指标列名的方法为:(murmurhash(key)>>48)/64。在生成第二待更新行键值和待更新指标列名之后,所述第二更新模块70可以根据所述日志指标数据对所述指标数据存储表中与所述第二待更新行键值和所述待更新指标列名对应的指标数据进行更新。以上述图1对应实施例中的表2为例,若所述第二待更新行键值为xxx_hashcode_1_time,所述待更新指标列名为0000,则所述第二更新模块70可以根据所述日志指标数据对SliceIndex_1进行更新;其中,对SliceIndex_1进行更新的过程可以包括:
对全局计数指标countTotal的更新:countTotal+1;
对估计用户数指标数组buckets的更新:
p=(murmurhash(key)>>48)%64
zeroNum=(murmurhash(key)<<16)的前导零个数
if(buckets.get(p)<zeroNum)then bucket.set(p,zeroNum);
若更新的指标为计数指标的第i个:countIndex.get(i)+1;
若更新的指标为去重指标的第i个:distincts.get(i).set(v);
若更新的指标为合计指标的第i个:sum.get(i)+v;
若更新的指标为最小值指标的第i个:Min(min.get(i),v);
若更新的指标为最大值指标的第i个:Max(max.get(i),v);
若更新的指标为平均值指标的第i个:(avg.get(i)*(countTotal.get(i)-1)+v)/countTotal.get(i)。
可选地,若无法在所述指标数据存储表中查找到第二待更新行键值,则所述第二更新模块70可以在所述指标数据存储表中新增一行,以将所述第二待更新行键值写入新增的行中,并在该新增的行中且与所述待更新指标列名对应的位置处写入所述日志指标数据。
进一步的,再请参见图6,是上述图4或图5对应实施例中的一种第一获取模块10的结构示意图,所述第一获取模块10可以包括:请求获取单元101、维度获取单元102、第一行键获取单元103;
所述请求获取单元101,用于获取统计查询请求,所述统计查询请求携带有查询维度值;
具体的,当所述请求获取单元101接收到统计查询请求时,可以获取所述统计查询请求所携带的查询维度值。
所述维度获取单元102,用于在所述维度索引表中的所述至少一个维度值中获取与所述查询维度值对应的维度值,并将与所述查询维度值对应的维度值确定为目标维度值;
具体的,所述请求获取单元101获取到查询维度值之后,所述维度获取单元102可以在所述维度索引表中的所述至少一个维度值中获取与所述查询维度值对应的维度值,并将与所述查询维度值对应的维度值确定为目标维度值。以上述图1对应实施例中的表1为例,查询维度值包括维度值A和维度值B,若所述维度获取单元102在表1的列族中查找到与维度值A相同的维度值为Bytes_1,与维度值B相同的维度值为Bytes_2,则将Bytes_1和Bytes_2确定为目标维度值。
所述第一行键获取单元103,用于在所述维度索引表中的所述至少一个第一行键值中获取与所述目标维度值对应的第一行键值,并将与所述目标维度值对应的第一行键值确定为第一目标行键值;
具体的,所述维度获取单元102确定出目标维度值之后,所述第一行键获取单元103可以在所述维度索引表中的所述至少一个第一行键值中获取与所述目标维度值对应的第一行键值,并将与所述目标维度值对应的第一行键值确定为第一目标行键值。再以上述表1为例,若确定出的目标维度值为Bytes_1和Bytes_2,则所述第一行键获取单元103可以在表1的行键中获取到与Bytes_1对应的第一行键值为xxx_hashcode_1,以及Bytes_2对应的第一行键值为xxx_hashcode_2,并将xxx_hashcode_1和xxx_hashcode_2确定为第一目标行键值。
进一步的,再请参见图7,是上述图4或图5中的一种第二获取模块20的结构示意图,所述第二获取模块20可以包括:时间值生成单元201、拼接单元202、第二行键获取单元203;
所述时间值生成单元201,用于根据所述时间粒度和所述统计查询请求所携带的统计时间范围,生成在所述统计时间范围内的至少一个目标时间值;
具体的,所述统计查询请求还包括统计时间范围。所述时间值生成单元201可以根据所述时间粒度和所述统计查询请求所携带的统计时间范围,生成在所述统计时间范围内的至少一个目标时间值。例如,若统计时间范围为全天,且预设的时间粒度为1个小时,则所述时间值生成单元201所生成的目标时间值包括0000、0100、0200、…、2300,即0:00到23:00的时间值。
所述拼接单元202,用于将所述至少一个目标时间值中各目标时间值分别与所述第一目标行键值进行拼接,以得到待查询行键值;
具体的,所述时间值生成单元201生成至少一个目标时间值之后,所述拼接单元202可以将所述至少一个目标时间值中各目标时间值分别与所述第一目标行键值进行拼接,以得到待查询行键值。例如,若所述统计时间范围为全天且时间粒度为1个小时,且所述第一目标行键值为xxx_hashcode_2,则所述至少一个目标时间值包括0000、0100、0200、…、2300,所述拼接单元202将xxx_hashcode_2分别与所述至少一个目标时间值中各目标时间值进行拼接,可以得到待查询行键值,所述待查询行键值包括:xxx_hashcode_2_0000、xxx_hashcode_2_0100、…、xxx_hashcode_2_2300。
所述第二行键获取单元203,用于在所述指标数据存储表中的所述至少一个第二行键值中获取与所述待查询行键值对应的第二行键值,并将与所述待查询行键值对应的第二行键值确定为第二目标行键值;
具体的,所述拼接单元202得到待查询行键值之后,所述第二行键获取单元203可以在所述指标数据存储表中的所述至少一个第二行键值中获取与所述待查询行键值对应的第二行键值,并将与所述待查询行键值对应的第二行键值确定为第二目标行键值。例如,所述待查询行键值包括:xxx_hashcode_2_0000、xxx_hashcode_2_0100、…、xxx_hashcode_2_2300,所述第二行键获取单元203在所述指标数据存储表中查找是否存在与所述待查询行键值相同的第二行键值,若在所述指标数据存储表中查找到与所述待查询行键值相同的第二行键值包括xxx_hashcode_2_0000和xxx_hashcode_2_0100,则所述第二行键获取单元203将所述指标数据存储表中的xxx_hashcode_2_0000和xxx_hashcode_2_0100确定为第二目标行键值。
进一步的,再请参见图8,是上述图4或图5中的一种合并模块30的结构示意图,所述合并模块30可以包括:指标数据获取单元301、指标数据合并单元302;
所述指标数据获取单元301,用于在所述指标数据存储表中的所述至少一个指标数据中获取与所述第二目标行键值对应的指标数据,并将与所述第二目标行键值对应的指标数据确定为目标指标数据;
具体的,所述指标数据获取单元301可以在所述指标数据存储表中的所述至少一个指标数据中获取与所述第二目标行键值对应的指标数据,并将与所述第二目标行键值对应的指标数据确定为目标指标数据。以上述图1对应实施例中的表2为例,若所述第二目标行键值包括:xxx_hashcode_1_time和xxx_hashcode_2_time,则与xxx_hashcode_1_time同一行的各列指标数据均为目标指标数据,且与xxx_hashcode_2_time同一行的各列指标数据也均为目标指标数据。
所述指标数据合并单元302,用于将所述目标指标数据进行行合并,并将行合并后的目标指标数据进行列合并,以得到与所述统计查询请求对应的统计数据;
具体的,所述指标数据获取单元301确定出目标指标数据之后,所述指标数据合并单元302可以先将所述目标指标数据进行行合并,在行合并时可以从上至下分别对每列的目标指标数据依次进行两两合并,直至行合并到剩下一行目标指标数据。再请参见上述图1对应实施例中的表2,以SliceIndex_1和SliceIndex_2进行行合并为例,若SliceIndex_1和SliceIndex_2均包括全局计数指标、估计用户数指标数组、计数指标、去重指标、合计指标、最大值指标、最小值指标以及平均值指标,则所述指标数据合并单元302对SliceIndex_1和SliceIndex_2进行行合并的具体过程包括:
全局计数指标的合并:sliceIndex1.countTotal+sliceIndex2.countTotal;
估计用户数指标数组的合并:
计数指标的合并:sliceIndex1.countIndex+sliceIndex2.countIndex;
去重指标的合并:sliceIndex1.distincts.addAll(sliceIndex2.distincts)(集合合并);
合计指标的合并:sliceIndex1.sum+sliceIndex2.sum;
最小值指标的合并:Min(sliceIndex1.min,sliceIndex2.min);
最小值指标的合并:Max(sliceIndex1.max,sliceIndex2.max);
平均值指标的合并:
(sliceIndex1.avg*sliceIndex1.countIndex1+sliceIndex2.avg*sliceIndex2.countIndex2)/(sliceIndex1.countIndex1+sliceIndex2.countIndex2)。
其中,所述指标数据合并单元302对行合并后的目标指标数据进行列合并的过程与行合并的过程类似,即在列合并时可以对各列中行合并后的目标指标数据依次进行两两合并,直至列合并到剩下一个总的目标指标数据,所述总的目标指标数据即为与所述统计查询请求对应的统计数据。其中,列合并和行合并不一样的地方仅在于对估计用户数指标数组的合并,在列合并之前需要先根据各列中行合并后的估计用户数指标数组这个变量计算出一个用户数数值,再在列合并时直接累加各列计算出的用户数数值即可统计出某种维度条件下查询的估计用户数这个指标值的总量,对于其他指标的列合并的过程与行合并的过程相同。其中,根据估计用户数指标数组这个变量计算出一个用户数数值的具体过程可以为:
其中,userCount为计算出的用户数数值。
本发明实施例通过在维度索引表中获取与统计查询请求所携带的查询维度值对应的第一目标行键值,再在指标数据存储表中获取与第一目标行键值对应的第二目标行键值,可以将指标数据存储表中与第二目标行键值对应的目标指标数据进行合并,以得到统计数据。由于日志记录中的维度值和指标数据分别存储于维度索引表和指标数据存储表中,且只需通过扫描维度索引表即可对指标数据存储表中的目标指标数据进行统计汇总,即无需对所有日志记录都进行扫描,所以可以减少需要扫描的数据量,以提高对数据进行统计汇总的效率;而且通过提取所述日志记录信息中的日志指标数据、日志维度值、时间信息以及关键字段,可以对维度索引表中对应的维度值进行更新并对指标数据存储表中对应的指标数据进行更新,由于写入日志记录信息时可以只更新相应位置的维度值和指标数据,即可以避免每写入一条日志记录信息就要增加一条行数,所以有效减少了存储开销;同时,通过更新维度值和指标数据的方式来写入日志记录信息,也可以在统计查询时降低所需扫描的数据量,以进一步提高对数据进行统计汇总的效率。
请参见图9,是本发明实施例提供的又一种数据统计装置的结构示意图,所述数据统计装置1000可以包括:至少一个处理器1001,例如CPU,至少一个网络接口1004,用户接口1003,存储器1005,至少一个通信总线1002。其中,通信总线1002用于实现这些组件之间的连接通信。其中,用户接口1003可以包括显示屏(Display)、键盘(Keyboard),可选用户接口1003还可以包括标准的有线接口、无线接口。网络接口1004可选的可以包括标准的有线接口、无线接口(如WI-FI接口)。存储器1005可以是高速RAM存储器,也可以是非不稳定的存储器(non-volatile memory),例如至少一个磁盘存储器。存储器1005可选的还可以是至少一个位于远离前述处理器1001的存储装置。如图9所示,作为一种计算机存储介质的存储器1005中可以包括操作***、网络通信模块、用户接口模块以及设备控制应用程序。
在图9所示的数据统计装置1000中,网络接口1004主要用于连接用户终端,与所述用户终端进行数据通信;而用户接口1003主要用于为用户提供输入的接口,获取用户输出的数据;而处理器1001可以用于调用存储器1005中存储的设备控制应用程序,并具体执行以下步骤:
获取统计查询请求,在预设的维度索引表的列族中获取与所述统计查询请求所携带的查询维度值对应的目标维度值,并在所述维度索引表的行键中获取与所述目标维度值对应的第一目标行键值;
在预设的指标数据存储表的行键中获取与所述第一目标行键值对应的第二目标行键值;
将所述指标数据存储表的列族中与所述第二目标行键值对应的目标指标数据进行合并,以得到与所述统计查询请求对应的统计数据。
在一个实施例中,所述处理器1001在执行获取统计查询请求,在预设的维度索引表的列族中获取与所述统计查询请求所携带的查询维度值对应的目标维度值,并在所述维度索引表的行键中获取与所述目标维度值对应的第一目标行键值之前,还执行以下步骤:
根据HBase数据库预设维度索引表和指标数据存储表;
其中,所述维度索引表的列族包括至少一个维度列名,所述至少一个维度列名中各维度列名分别对应至少一个维度值,所述维度索引表的行键包括至少一个第一行键值,所述至少一个第一行键值是根据所述至少一个维度值计算得到的;
其中,所述指标数据存储表的列族包括至少一个指标列名,所述至少一个指标列名中各指标列名分别对应至少一个指标数据,所述指标数据存储表的行键包括至少一个第二行键值,所述至少一个第二行键值是根据所述至少一个维度值和时间值计算得到的,所述时间值是按照预设的时间粒度所划分的。
在一个实施例中,所述处理器1001在执行获取统计查询请求,在预设的维度索引表的列族中获取与所述统计查询请求所携带的查询维度值对应的目标维度值,并在所述维度索引表的行键中获取与所述目标维度值对应的第一目标行键值时,具体执行以下步骤:
获取统计查询请求,所述统计查询请求携带有查询维度值;
在所述维度索引表中的所述至少一个维度值中获取与所述查询维度值对应的维度值,并将与所述查询维度值对应的维度值确定为目标维度值;
在所述维度索引表中的所述至少一个第一行键值中获取与所述目标维度值对应的第一行键值,并将与所述目标维度值对应的第一行键值确定为第一目标行键值。
在一个实施例中,所述处理器1001在执行在预设的指标数据存储表的行键中获取与所述第一目标行键值对应的第二目标行键值时,具体执行以下步骤:
根据所述时间粒度和所述统计查询请求所携带的统计时间范围,生成在所述统计时间范围内的至少一个目标时间值;
将所述至少一个目标时间值中各目标时间值分别与所述第一目标行键值进行拼接,以得到待查询行键值;
在所述指标数据存储表中的所述至少一个第二行键值中获取与所述待查询行键值对应的第二行键值,并将与所述待查询行键值对应的第二行键值确定为第二目标行键值。
在一个实施例中,所述处理器1001在执行将所述指标数据存储表的列族中与所述第二目标行键值对应的目标指标数据进行合并,以得到与所述统计查询请求对应的统计数据时,具体执行以下步骤:
在所述指标数据存储表中的所述至少一个指标数据中获取与所述第二目标行键值对应的指标数据,并将与所述第二目标行键值对应的指标数据确定为目标指标数据;
将所述目标指标数据进行行合并,并将行合并后的目标指标数据进行列合并,以得到与所述统计查询请求对应的统计数据。
在一个实施例中,所述处理器1001还执行以下步骤:
当获取到日志记录信息时,提取所述日志记录信息中的日志指标数据、日志维度值、时间信息以及关键字段;
根据所述日志维度值生成第一待更新行键值,并根据所述日志维度值对所述维度索引表中与所述第一待更新行键值对应的各个维度值进行更新;
根据所述日志维度值和所述时间信息生成第二待更新行键值,并根据所述关键字段生成待更新指标列名,并根据所述日志指标数据对所述指标数据存储表中与所述第二待更新行键值和所述待更新指标列名对应的指标数据进行更新。
本发明实施例通过在维度索引表中获取与统计查询请求所携带的查询维度值对应的第一目标行键值,再在指标数据存储表中获取与第一目标行键值对应的第二目标行键值,可以将指标数据存储表中与第二目标行键值对应的目标指标数据进行合并,以得到统计数据。由于日志记录中的维度值和指标数据分别存储于维度索引表和指标数据存储表中,且只需通过扫描维度索引表即可对指标数据存储表中的目标指标数据进行统计汇总,即无需对所有日志记录都进行扫描,所以可以减少需要扫描的数据量,以提高对数据进行统计汇总的效率;而且通过提取所述日志记录信息中的日志指标数据、日志维度值、时间信息以及关键字段,可以对维度索引表中对应的维度值进行更新并对指标数据存储表中对应的指标数据进行更新,由于写入日志记录信息时可以只更新相应位置的维度值和指标数据,即可以避免每写入一条日志记录信息就要增加一条行数,所以有效减少了存储开销;同时,通过更新维度值和指标数据的方式来写入日志记录信息,也可以在统计查询时降低所需扫描的数据量,以进一步提高对数据进行统计汇总的效率。
本领域普通技术人员可以理解实现上述实施例方法中的全部或部分流程,是可以通过计算机程序来指令相关的硬件来完成,所述的程序可存储于一计算机可读取存储介质中,该程序在执行时,可包括如上述各方法的实施例的流程。其中,所述的存储介质可为磁碟、光盘、只读存储记忆体(Read-Only Memory,ROM)或随机存储记忆体(Random AccessMemory,RAM)等。
以上所揭露的仅为本发明较佳实施例而已,当然不能以此来限定本发明之权利范围,因此依本发明权利要求所作的等同变化,仍属本发明所涵盖的范围。

Claims (12)

1.一种数据统计方法,其特征在于,包括:
获取统计查询请求,在预设的维度索引表的列族中获取与所述统计查询请求所携带的查询维度值对应的目标维度值,并在所述维度索引表的行键中获取与所述目标维度值对应的第一目标行键值;
在预设的指标数据存储表的行键中获取与所述第一目标行键值对应的第二目标行键值;
将所述指标数据存储表的列族中与所述第二目标行键值对应的目标指标数据进行合并,以得到与所述统计查询请求对应的统计数据。
2.如权利要求1所述的方法,其特征在于,在所述获取统计查询请求,在预设的维度索引表的列族中获取与所述统计查询请求所携带的查询维度值对应的目标维度值,并在所述维度索引表的行键中获取与所述目标维度值对应的第一目标行键值的步骤之前,还包括:
根据HBase数据库预设维度索引表和指标数据存储表;
其中,所述维度索引表的列族包括至少一个维度列名,所述至少一个维度列名中各维度列名分别对应至少一个维度值,所述维度索引表的行键包括至少一个第一行键值,所述至少一个第一行键值是根据所述至少一个维度值计算得到的;
其中,所述指标数据存储表的列族包括至少一个指标列名,所述至少一个指标列名中各指标列名分别对应至少一个指标数据,所述指标数据存储表的行键包括至少一个第二行键值,所述至少一个第二行键值是根据所述至少一个维度值和时间值计算得到的,所述时间值是按照预设的时间粒度所划分的。
3.如权利要求2所述的方法,其特征在于,所述获取统计查询请求,在预设的维度索引表的列族中获取与所述统计查询请求所携带的查询维度值对应的目标维度值,并在所述维度索引表的行键中获取与所述目标维度值对应的第一目标行键值,包括:
获取统计查询请求,所述统计查询请求携带有查询维度值;
在所述维度索引表中的所述至少一个维度值中获取与所述查询维度值对应的维度值,并将与所述查询维度值对应的维度值确定为目标维度值;
在所述维度索引表中的所述至少一个第一行键值中获取与所述目标维度值对应的第一行键值,并将与所述目标维度值对应的第一行键值确定为第一目标行键值。
4.如权利要求2所述的方法,其特征在于,所述在预设的指标数据存储表的行键中获取与所述第一目标行键值对应的第二目标行键值,包括:
根据所述时间粒度和所述统计查询请求所携带的统计时间范围,生成在所述统计时间范围内的至少一个目标时间值;
将所述至少一个目标时间值中各目标时间值分别与所述第一目标行键值进行拼接,以得到待查询行键值;
在所述指标数据存储表中的所述至少一个第二行键值中获取与所述待查询行键值对应的第二行键值,并将与所述待查询行键值对应的第二行键值确定为第二目标行键值。
5.如权利要求2所述的方法,其特征在于,所述将所述指标数据存储表的列族中与所述第二目标行键值对应的目标指标数据进行合并,以得到与所述统计查询请求对应的统计数据,包括:
在所述指标数据存储表中的所述至少一个指标数据中获取与所述第二目标行键值对应的指标数据,并将与所述第二目标行键值对应的指标数据确定为目标指标数据;
将所述目标指标数据进行行合并,并将行合并后的目标指标数据进行列合并,以得到与所述统计查询请求对应的统计数据。
6.如权利要求2所述的方法,其特征在于,还包括:
当获取到日志记录信息时,提取所述日志记录信息中的日志指标数据、日志维度值、时间信息以及关键字段;
根据所述日志维度值生成第一待更新行键值,并根据所述日志维度值对所述维度索引表中与所述第一待更新行键值对应的各个维度值进行更新;
根据所述日志维度值和所述时间信息生成第二待更新行键值,并根据所述关键字段生成待更新指标列名,并根据所述日志指标数据对所述指标数据存储表中与所述第二待更新行键值和所述待更新指标列名对应的指标数据进行更新。
7.一种数据统计装置,其特征在于,包括:
第一获取模块,用于获取统计查询请求,在预设的维度索引表的列族中获取与所述统计查询请求所携带的查询维度值对应的目标维度值,并在所述维度索引表的行键中获取与所述目标维度值对应的第一目标行键值;
第二获取模块,用于在预设的指标数据存储表的行键中获取与所述第一目标行键值对应的第二目标行键值;
合并模块,用于将所述指标数据存储表的列族中与所述第二目标行键值对应的目标指标数据进行合并,以得到与所述统计查询请求对应的统计数据。
8.如权利要求7所述的装置,其特征在于,还包括:
预设模块,用于根据HBase数据库预设维度索引表和指标数据存储表;
其中,所述维度索引表的列族包括至少一个维度列名,所述至少一个维度列名中各维度列名分别对应至少一个维度值,所述维度索引表的行键包括至少一个第一行键值,所述至少一个第一行键值是根据所述至少一个维度值计算得到的;
其中,所述指标数据存储表的列族包括至少一个指标列名,所述至少一个指标列名中各指标列名分别对应至少一个指标数据,所述指标数据存储表的行键包括至少一个第二行键值,所述至少一个第二行键值是根据所述至少一个维度值和时间值计算得到的,所述时间值是按照预设的时间粒度所划分的。
9.如权利要求8所述的装置,其特征在于,所述第一获取模块包括:
请求获取单元,用于获取统计查询请求,所述统计查询请求携带有查询维度值;
维度获取单元,用于在所述维度索引表中的所述至少一个维度值中获取与所述查询维度值对应的维度值,并将与所述查询维度值对应的维度值确定为目标维度值;
第一行键获取单元,用于在所述维度索引表中的所述至少一个第一行键值中获取与所述目标维度值对应的第一行键值,并将与所述目标维度值对应的第一行键值确定为第一目标行键值。
10.如权利要求8所述的装置,其特征在于,所述第二获取模块包括:
时间值生成单元,用于根据所述时间粒度和所述统计查询请求所携带的统计时间范围,生成在所述统计时间范围内的至少一个目标时间值;
拼接单元,用于将所述至少一个目标时间值中各目标时间值分别与所述第一目标行键值进行拼接,以得到待查询行键值;
第二行键获取单元,用于在所述指标数据存储表中的所述至少一个第二行键值中获取与所述待查询行键值对应的第二行键值,并将与所述待查询行键值对应的第二行键值确定为第二目标行键值。
11.如权利要求8所述的装置,其特征在于,所述合并模块包括:
指标数据获取单元,用于在所述指标数据存储表中的所述至少一个指标数据中获取与所述第二目标行键值对应的指标数据,并将与所述第二目标行键值对应的指标数据确定为目标指标数据;
指标数据合并单元,用于将所述目标指标数据进行行合并,并将行合并后的目标指标数据进行列合并,以得到与所述统计查询请求对应的统计数据。
12.如权利要求8所述的装置,其特征在于,还包括:
信息提取模块,用于当获取到日志记录信息时,提取所述日志记录信息中的日志指标数据、日志维度值、时间信息以及关键字段;
第一更新模块,用于根据所述日志维度值生成第一待更新行键值,并根据所述日志维度值对所述维度索引表中与所述第一待更新行键值对应的各个维度值进行更新;
第二更新模块,用于根据所述日志维度值和所述时间信息生成第二待更新行键值,并根据所述关键字段生成待更新指标列名,并根据所述日志指标数据对所述指标数据存储表中与所述第二待更新行键值和所述待更新指标列名对应的指标数据进行更新。
CN201510070951.0A 2015-02-10 2015-02-10 一种数据统计方法以及装置 Active CN105989076B (zh)

Priority Applications (1)

Application Number Priority Date Filing Date Title
CN201510070951.0A CN105989076B (zh) 2015-02-10 2015-02-10 一种数据统计方法以及装置

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CN201510070951.0A CN105989076B (zh) 2015-02-10 2015-02-10 一种数据统计方法以及装置

Publications (2)

Publication Number Publication Date
CN105989076A CN105989076A (zh) 2016-10-05
CN105989076B true CN105989076B (zh) 2019-05-07

Family

ID=57041808

Family Applications (1)

Application Number Title Priority Date Filing Date
CN201510070951.0A Active CN105989076B (zh) 2015-02-10 2015-02-10 一种数据统计方法以及装置

Country Status (1)

Country Link
CN (1) CN105989076B (zh)

Families Citing this family (18)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN106528674B (zh) * 2016-10-31 2019-10-01 厦门服云信息科技有限公司 基于Hbase行健的高性能查询方法和装置
CN106682100B (zh) * 2016-12-02 2020-10-20 浙江宇视科技有限公司 一种基于Hbase数据库的数据统计方法与***
CN106649687B (zh) * 2016-12-16 2023-11-21 飞狐信息技术(天津)有限公司 大数据联机分析处理方法及装置
CN107767010A (zh) * 2017-08-04 2018-03-06 平安科技(深圳)有限公司 范围值数据统计方法、电子装置及计算机可读存储介质
CN108398641B (zh) * 2017-11-30 2021-03-09 深圳市科列技术股份有限公司 一种电池数据处理方法和电池数据服务器
CN110019014A (zh) * 2017-12-19 2019-07-16 华为技术有限公司 向文件***写入数据记录的方法和装置
CN110413631B (zh) * 2018-04-25 2022-06-10 中移(苏州)软件技术有限公司 一种数据查询方法及装置
CN109165377A (zh) * 2018-06-11 2019-01-08 玖富金科控股集团有限责任公司 生成表单数据的方法和制表设备
CN109033158A (zh) * 2018-06-14 2018-12-18 浙江口碑网络技术有限公司 基于指定时间窗的数据去重统计方法及装置
CN109145059A (zh) * 2018-06-29 2019-01-04 深圳市彬讯科技有限公司 用于数据统计的数据处理方法、服务器及存储介质
CN110990394B (zh) * 2018-09-28 2023-10-20 杭州海康威视数字技术股份有限公司 分布式面向列数据库表的行数统计方法、装置和存储介质
CN109299141A (zh) * 2018-10-19 2019-02-01 深圳市元征科技股份有限公司 一种数据查询的方法、***及相关组件
CN109299106B (zh) * 2018-10-31 2020-09-22 中国联合网络通信集团有限公司 数据查询方法和装置
CN111221883B (zh) * 2018-11-27 2024-04-26 浙江宇视科技有限公司 数据统计方法及***
CN109783646B (zh) * 2019-02-12 2022-08-12 四川大学华西医院 一种数据处理方法及装置
CN110460876A (zh) * 2019-08-15 2019-11-15 网易(杭州)网络有限公司 直播日志的处理方法、装置及电子设备
CN110688412A (zh) * 2019-09-27 2020-01-14 杭州有赞科技有限公司 一种基于es的海量数据统计方法及海量数据统计***
CN111782645A (zh) * 2019-11-29 2020-10-16 北京沃东天骏信息技术有限公司 数据处理方法和装置

Citations (4)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN102750356A (zh) * 2012-06-11 2012-10-24 清华大学 一种键值库辅助索引的构建与管理方法
CN103020204A (zh) * 2012-12-05 2013-04-03 北京普泽天玑数据技术有限公司 一种对分布式顺序表进行多维区间查询的方法及其***
CN103617232A (zh) * 2013-11-26 2014-03-05 北京京东尚科信息技术有限公司 一种针对HBase表的分页查询方法
CN104239567A (zh) * 2014-09-28 2014-12-24 北京国双科技有限公司 数据仓库中的维度处理方法和装置

Family Cites Families (1)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
KR20020032803A (ko) * 2000-10-27 2002-05-04 구자홍 스트리밍 서비스를 위한 파일 구조

Patent Citations (4)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN102750356A (zh) * 2012-06-11 2012-10-24 清华大学 一种键值库辅助索引的构建与管理方法
CN103020204A (zh) * 2012-12-05 2013-04-03 北京普泽天玑数据技术有限公司 一种对分布式顺序表进行多维区间查询的方法及其***
CN103617232A (zh) * 2013-11-26 2014-03-05 北京京东尚科信息技术有限公司 一种针对HBase表的分页查询方法
CN104239567A (zh) * 2014-09-28 2014-12-24 北京国双科技有限公司 数据仓库中的维度处理方法和装置

Also Published As

Publication number Publication date
CN105989076A (zh) 2016-10-05

Similar Documents

Publication Publication Date Title
CN105989076B (zh) 一种数据统计方法以及装置
EP3819793B1 (en) Query method, apparatus, electronic device and storage medium
US20220171736A1 (en) Managing datasets generated by search queries
CN107832407B (zh) 用于生成知识图谱的信息处理方法、装置和可读存储介质
US20210011932A1 (en) Generating events in excess of licensed event count
CN109344153B (zh) 业务数据的处理方法及终端设备
US11477263B2 (en) Identifying un-deployed features of an application
US10657680B2 (en) Simplified point-in-polygon test for processing geographic data
US8656225B2 (en) Network fault management in busy periods
CN107332685A (zh) 国网云中应用的一种基于大数据运维日志的方法
CN108536745A (zh) 基于Shell的数据表提取方法、终端、设备及存储介质
CN108965337A (zh) 规则匹配方法、装置、防火墙设备及机器可读存储介质
CN112861494A (zh) 基于路网数据的可视化报表生成方法、设备和存储介质
CN107688626A (zh) 慢查询日志处理方法、装置及电子设备
US11921702B2 (en) Issue rank management in an issue tracking system
CN110674168A (zh) 一种缓存键异常检测方法、装置、存储介质以及终端
EP4216076A1 (en) Method and apparatus of processing an observation information, electronic device and storage medium
KR20210000041A (ko) 로그 데이터의 실시간 분석 방법 및 그 장치
CN115295164A (zh) 医保数据的处理方法、装置、电子设备和存储介质
CN109491787A (zh) 一种集群计算环境下计算资源的记账统计方法和***
Xiaobing et al. An insight into traffic safety management system platform based on cloud computing
CN113486237A (zh) 一种航班信息的推荐方法、***、存储介质和电子设备
CN114356712A (zh) 数据处理方法、装置、设备、可读存储介质及程序产品
CN109063201B (zh) 一种基于混合存储方案的impala在线交互式查询方法
US11259169B2 (en) Highly scalable home subscriber server

Legal Events

Date Code Title Description
C06 Publication
PB01 Publication
SE01 Entry into force of request for substantive examination
SE01 Entry into force of request for substantive examination
GR01 Patent grant
GR01 Patent grant
TR01 Transfer of patent right
TR01 Transfer of patent right

Effective date of registration: 20190730

Address after: Shenzhen Futian District City, Guangdong province 518000 Zhenxing Road, SEG Science Park 2 East Room 403

Co-patentee after: Tencent cloud computing (Beijing) limited liability company

Patentee after: Tencent Technology (Shenzhen) Co., Ltd.

Address before: Shenzhen Futian District City, Guangdong province 518000 Zhenxing Road, SEG Science Park 2 East Room 403

Patentee before: Tencent Technology (Shenzhen) Co., Ltd.