著录项信息
专利名称 | 一种海量医疗数据的快速统计查询方法 |
申请号 | CN201210587210.6 | 申请日期 | 2012-12-28 |
法律状态 | 授权 | 申报国家 | 中国 |
公开/公告日 | 2013-04-17 | 公开/公告号 | CN103049556A |
优先权 | 暂无 | 优先权号 | 暂无 |
主分类号 | G06F17/30 | IPC分类号 | G;0;6;F;1;7;/;3;0查看分类表>
|
申请人 | 中国科学院深圳先进技术研究院 | 申请人地址 | 广东省深圳市南山区西丽大学城学苑大道1068号
变更
专利地址、主体等相关变化,请及时变更,防止失效 |
权利人 | 中国科学院深圳先进技术研究院 | 当前权利人 | 中国科学院深圳先进技术研究院 |
发明人 | 张帆;彭智;须成忠;闫茜;甘波 |
代理机构 | 深圳中一专利商标事务所 | 代理人 | 梁珣 |
摘要
本发明公开了一种海量医疗数据的快速统计查询方法。首先从不同的数据源收集、过滤和处理医疗数据,保存处理后的医疗数据到分布式文件系统hdfs或者hbase中;针对某个或某些基于统计的医疗数据,利用所述分布式文件系统hdfs或者hbase来创建并初始化统计树;针对新增的医疗数据进行一个或多个增量计算,并用增量计算的结果去更新所述统计树;服务端基于所创建的一个或者多个统计树来响应用户的统计查询请求,将所述统计查询请求解析成基于一个或者多个统计树的子查询,并合并成多个子查询的结果返回给所述用户。该方法可以迅速定位统计数据的位置,避免大数据量的访问,从而减轻了系统负载,提高了查询效率和访问的并发性。
一种海量医疗数据的快速统计查询方法\n技术领域\n[0001] 本发明涉及医疗数据技术领域,尤其涉及一种海量医疗数据的快速统计查询方法。\n背景技术\n[0002] 目前,随着我国经济持续稳定的发展和现代科技的日新月异,人们越来越多的关注自身健康,在满足日常工作和生活的需求之外,人们也迫切希望通过网络或者手机上网就能随时查看流行病的季节信息、了解每种疾病下的用药情况以及针对自身疾病获得一些个性化的推荐服务等。对于公共卫生机构,它们希望各个社区居民的医疗数据能够自动汇总,并自动对这些数据进行统计分析,统计的结果用来进行流行病的趋势分析和爆发预警,从而为制定防治干预计划提供有力的参考依据。\n[0003] 与此同时,随着国家新医改政策的颁布和实施,与健康直接相关的医疗行业开始迅猛发展,医疗数据越来越趋于高度集中化。大规模区域医疗信息系统和大型医疗数据中心将逐步建立,数据总量可达PB级以上的存储需求,日更新量GB级甚至TB级。在海量医疗数据的访问上,存在大规模数据统计计算的服务,而且需要尽可能快的查询响应时间,通常还需要能够做到高并发,例如各种统计查询。同时健康云系统的基于统计的业务也相当复杂,且需求变化大,需要系统有很多的扩展性。而且医疗数据规模很大,且医疗数据之间具有强关联性,不同类型的用户对同一数据具有不同的观察视角,从而对医疗数据的存储模型有很高的要求以应付灵活多变的数据请求,大规模数据上还存在大量已知的或者未知的数据分析需求,查询的总类多,需要支持各种定制性查询。\n[0004] 新的需求和国家政策必然推动大规模区域医疗信息系统和大型医疗数据中心的建立,这使得海量医疗数据上的快速统计查询成为一个研究的难点问题。目前现有技术中实现医疗数据快速统计主要有两种算法:一种是使用传统的数据库实施即时统计,但使用该方法来进行统计查询的效率很低;另一种方法是将基于MapReduce对hdfs上的数据进行并行统计分析,然后将分析的结果保存到hbase服务器中,最后在hbase服务器上实现统计查询,相较于传统关系数据库的处理方法,这种算法的时间复杂度明显优越,但仍没有效解决数据量增大所带来的计算量扩大问题,依然无法保证算法在统计过程中的稳定性。\n[0005] 由此可见,由于全民医疗信息服务系统每天产生的数据量大,用户对统计查询的实时处理要求高,因此简单地采用传统数据库、商业并行数据库或者NOSQL数据库对海量医疗数据进行在线统计分析然后返回结果的方式已不能满足实际情况和需求。\n发明内容\n[0006] 本发明的目的是提供一种海量医疗数据的快速统计查询方法,该方法可以迅速定位统计数据的位置,避免大数据量的访问,从而减轻了系统负载,提高了查询效率和访问的并发性。\n[0007] 本发明的目的是通过以下技术方案实现的,一种海量医疗数据的快速统计查询方法,所述方法包括:\n[0008] 从不同的数据源收集、过滤和处理医疗数据,保存处理后的医疗数据到分布式文件系统hdfs或者hbase中;\n[0009] 针对某个或某些基于统计的医疗数据,利用所述分布式文件系统hdfs或者hbase来创建并初始化统计树;\n[0010] 针对新增的医疗数据进行一个或多个增量计算,并用增量计算的结果去更新所述统计树;\n[0011] 服务端基于所创建的一个或者多个统计树来响应用户的统计查询请求,将所述统计查询请求解析成基于一个或者多个统计树的子查询,并合并成多个子查询的结果返回给所述用户。\n[0012] 所述从不同的数据源收集、过滤和处理医疗数据,保存处理后的医疗数据到分布式文件系统hdfs或者hbase中,具体包括:\n[0013] 利用各种消息中间件从不同的数据源收集医疗数据,并基于MapReduce程序对所收集的医疗数据进行过滤处理,将过滤处理后的数据导入到分布式文件系统hdfs或者hbase中。\n[0014] 所述利用所述分布式文件系统hdfs或者hbase来创建并初始化统计树,具体包括:\n[0015] 利用传统数据库或分布式文件系统hdfs或者hbase来创建统计树,该统计树采用B-树的存储方式,且在所创建的统计树结构中,同层兄弟节点的统计值采用从左至右进行累加的计算方式;\n[0016] 借助sqoop工具初始化所创建的统计树,将收集并处理后的医疗数据导入到所创建的统计树中。\n[0017] 所述针对新增的医疗数据进行一个或多个增量计算,并用增量计算的结果去更新所述统计树,具体包括:\n[0018] 脚本程序依次调用执行一个或多个MapReduce程序对当日新增的医疗数据进行统计分析;\n[0019] 将所述统计分析结果集中的每条记录追加为所述统计树最新的一个叶子节点,同时累加更新该叶子节点上游的所有父亲节点的统计结果,实现统计树更新。\n[0020] 所述将统计查询请求解析成基于一个或者多个统计树的子查询,并合并成多个子查询的结果返回给所述用户,具体包括:\n[0021] 所述服务端接收用户提交的统计查询请求,并将其解析为一个或者多个统计树的子查询;\n[0022] 执行各个子查询,将每个子查询翻译成从所述统计树的存储结构中获取多个统计值,并对其通过简单的加减运算得到各个子查询对应的统计结果;\n[0023] 对所述各个子查询的统计结果进行合并,然后将合并后的结果返回给所述用户。\n[0024] 由上述本发明提供的技术方案可以看出,首先从不同的数据源收集、过滤和处理医疗数据,保存处理后的医疗数据到分布式文件系统hdfs或者hbase中;针对某个或某些基于统计的医疗数据,利用所述分布式文件系统hdfs或者hbase来创建并初始化统计树;针对新增的医疗数据进行一个或多个增量计算,并用增量计算的结果去更新所述统计树;服务端基于所创建的一个或者多个统计树来响应用户的统计查询请求,将所述统计查询请求解析成基于一个或者多个统计树的子查询,并合并成多个子查询的结果返回给所述用户。该方法可以迅速定位统计数据的位置,避免大数据量的访问,从而减轻了系统负载,提高了查询效率和访问的并发性。\n附图说明\n[0025] 为了更清楚地说明本发明实施例的技术方案,下面将对实施例描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本发明的一些实施例,对于本领域的普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他附图。\n[0026] 图1为本发明实施例提供的海量医疗数据的快速统计查询方法流程示意图;\n[0027] 图2为本发明实施例所举实例存储模型的结构示意图;\n[0028] 图3为本发明实施例所举实例中统计树的存储结构示意图;\n[0029] 图4为本发明实施例所举实例中用户查询的流程示意图;\n[0030] 图5为本发明实施例所举实例中查询所耗时间的图表示意图。\n具体实施方式\n[0031] 下面结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本发明一部分实施例,而不是全部的实施例。基于本发明的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都属于本发明的保护范围。\n[0032] 本发明实施例所述方法基于增量计算和统计树支持快速统计算法,一方面利用增量计算只对当天的数据进行统计计算,然后用新的计算结果去更新统计树,从而避免了大量的重复计算;另一方面用户的查询都集中在对统计树的查询上,避免了大量即时的计算。\n下面将结合附图对本发明实施例作进一步地详细描述,如图1所示为本发明实施例提供的海量医疗数据的快速统计查询方法流程示意图,所述方法包括:\n[0033] 步骤11:从不同的数据源收集、过滤和处理医疗数据,保存处理后的医疗数据到分布式文件系统hdfs或者hbase中。\n[0034] 在该步骤中,首先按利用各种消息中间件从不同的数据源收集医疗数据,具体实现中,由于收集上来的医疗数据可能有坏数据、不合理的数据或者是重复的数据等,因此在服务端还需要有过滤组件来处理这些异常情况,因为MapReduce(映射规约)支持多数据源输入,因此过滤组件可以基于MapReduce来实现,进一步的基于MapReduce程序对所收集的医疗数据进行过滤处理,将过滤处理后的数据导入到分布式文件系统hdfs或者hbase中。\n[0035] 在具体实现中,医疗数据的生成和采集通常来自于各大医院,但是随着物联网的发展,个人医疗数据还可以来自于体检中心、私人诊所、急救中心和家庭等任何适合的地方。\n[0036] 上述医疗数据从不同的地方源源不断地向数据中心集中,为了缓解网络和IO的压力,可以采用ActiveMQ、RabbitMQ、KafKa、Redis等作为消息中间件来收集数据;而数据来源的多样化必然导致收集数据的格式和类型不完全相同,进一步的基于多输入源的MapReduce程序可以对输入的记录进行过滤预处理(移除无意义的词,一个词的不同形式转换为相同形式,删除重复的数据等处理);然后将处理后的数据保存在分布式文件系统hdfs或者hbase中,利于后续基于MapReduce的分布式统计计算,通过并行处理保证高效的性能。\n[0037] 步骤12:针对某个或某些基于统计的医疗数据,利用所述分布式文件系统hdfs或者hbase来创建并初始化统计树。\n[0038] 在该步骤中,首先利用传统数据库或分布式文件系统hdfs或者hbase来创建统计树,该统计树采用B-树的存储方式,且在所创建的统计树结构中,同层兄弟节点的统计值采用从左至右进行累加的计算方式,这样在查询某个区间的统计值之和时,只需要将若干节点的统计值进行简单加减就可以得到统计结果,从而避免了区间内所有统计值相加造成的CPU负载过大问题;然后进一步借助sqoop(Hadoop和关系型数据库之间相互转移数据的工具)等工具来初始化所创建的统计树,即将处理后的医疗数据导入到所创建的统计树中。\n[0039] 下面以具体的实例对上述创建过程进行描述:\n[0040] 实际应用中,流行病分析、公共卫生事件预测、临床决策支持、慢性病管理、个性化的健康照护计划、日常卫生保健管理等基于统计信息的服务导致了大规模区域医疗信息系统和大型医疗数据中心的建立,因为这些信息服务必须建立在数据集中化的基础之上。基于上述原因,健康云系统必须要支持多样的高并发的海量医疗数据上的快速统计查询。\n[0041] 针对健康云上基于统计的服务集,本实施例构建了以多个统计树为叶子节点的按品类划分的目录树存储模型,配合后面介绍的增量计算模型以达到快速查询的目的。如图2所示为本发明实施例所举实例存储模型的结构示意图,图2中:每一个基于统计信息的查询服务对应一颗统计树,根据该服务的特征和类型选择把该统计树以叶子节点的形式挂载到目录树存储模型的某条路径下。这样,每个基于统计信息的查询服务就转换为在某个统计树上的快速查询了。\n[0042] 另外,如图3所示为本发明实施例所举实例中统计树的存储结构示意图,图3中:统计树以B-树的方式存储统计数据,且相邻兄弟节点之间通过累加的方式组织统计值。\n[0043] 举例来说,假设用户要查询深圳市某医院某科室从某个起始时间到某个终止时间的门诊人数,住院人数、门诊总费用和住院总费用情况,针对这种需求,建立按年,月和日三层时间划分的统计树。首先选取所有统计数据中最早年份的前一年作为统计初始年,采用分层累加的方式存储统计数据。例如2012年的节点值等于初始统计年至2012年的统计值之和,2012年8月的节点值等于2012年1月至2012年8月统计值之和,而2012年8月20日的节点值等于2012年8月1日至2012年8月20日的统计值之和。\n[0044] 设第n年的节点值为SYn,第n年的统计值为Yn,第n月的节点值为SMn,第n月的统计值为Mn,第n日的节点值为SDn,第n日的统计值为Dn,则有\n[0045] Yn=SYn-SYn-1,Mn=SMn-SMn-1,Dn=SDn-SDn-1,\n[0046] 若设第m年至第n年间的统计值之和为 同一年第m月至第n月间的统计值之和为且同一月第m日至第m日间的统计值之和为 则有\n[0047]\n[0048] 最后将每一层的统计结果进行叠加来实现给定初始和终止时间的快速查询。\n[0049] 对于上述统计树中出现某年,某月或某日缺省统计值的情况,那么该年,月或日在统计树中不创建对应的节点;对于不存在时间节点采取向前搜索最近的时间节点值作为该点的值。因此采用这种累加的方式在查询某个宽时间段的统计值之和时,只需要将若干节点的统计值进行简单加减就可以得到统计结果,从而避免了区间内所有统计值相加造成的CPU负载过大的问题。\n[0050] 步骤13:针对新增的医疗数据进行一个或多个增量计算,并用增量计算的结果去更新所述统计树。\n[0051] 在该步骤中,具体可以利用linux平台下的crontab模块,在每日的午夜闲时周期性地启动执行增量计算的脚本程序;该脚本程序依次调用执行一个或者多个MapReduce程序对当日新增的医疗数据进行统计分析;再将统计分析结果集中的每条记录追加为统计树的最新的一个叶子节点,同时累加更新该叶子节点上游的所有父亲节点的统计结果,实现统计树更新。上述微调由事务来保证其完整性,通过反复调用这种微调更新相应的统计树变化到最新状态。\n[0052] 具体实现中,由于上述增量计算是一个周期性的工作,因此需要准备一个脚本,将这个脚本的路径写入Iinux平台的crontab文件中,设定每晚午夜系统闲时在固定时间执行该脚本。在每次执行脚本过程中,调用多个MapReduce程序对各自的当天医疗数据进行过滤和统计分析;接着用统计分析的结果去更新相应的统计树。\n[0053] 举例来说,还是以查询深圳市某医院某科室从某个起始时间到某个终止时间的门诊人数,住院人数,门诊总费用和住院总费用情况为例。假设原来的统计树包含2012年10月\n10日之前的统计信息,现在统计出了2012年10月11日当天的信息,对于统计输出的每条记录,追加和更新原统计树的过程如下。输出每条记录需要在一个统计树的末尾追求一个日节点,这个节点的节点值为2012年10月10日的节点值加上2012年10月11日的统计值,然后将2012年10月11日的统计值分别累加到2012年10月和2012年这两个父亲节点上。\n[0054] 上述所有统计记录都以上面这种方式来更新对应的统计树,直到相应的统计树都被更新为止。\n[0055] 步骤14:服务端基于所创建的一个或者多个统计树来响应用户的统计查询请求,将所述统计查询请求解析成基于一个或者多个统计树的子查询,并合并成多个子查询的结果返回给所述用户。\n[0056] 在该步骤中,首先服务端接收用户提交的统计查询请求,并将其解析为一个或者多个统计树的子查询;然后执行各个子查询,将每个子查询翻译成从所述统计树的存储结构中获取多个统计值,并对其通过简单的加减运算得到该子查询对应的统计结果;再对各个子查询的统计结果进行合并,然后将合并后的结果返回给所述用户。\n[0057] 具体实现中,在健康云系统中,由于数据高度集中化,允许用户进行有差异的查询请求,系统需要提供可定制查询的能力,因此某个用户的查询请求,可能会涉及多个统计子查询,也可能会包含实时子查询。服务端首先需要将用户的请求解析为一个或者多个基于统计的子查询,甚至涉及其他实时的子查询,每个基于统计的子查询对应于在统计树上的若干操作。\n[0058] 举例来说,还是以用户查询深圳市某医院某科室从某个起始时间到某个终止时间的门诊人数,住院人数,门诊总费用和住院总费用情况为例。假设门诊和住院分属于不同类型的统计树,那么要得到某医院某科室在某个时间段内的统计记录,就需要分别查询对应的两个统计树,将两个统计记录合并成最后的统计记录返回给用户。如图4所示为本发明实施例所举实例中用户查询的流程示意图,结合本实施例所举例子以及图4:\n[0059] 假如某个子查询为深圳市南山医院妇产科从2008年5月20号到2011年3月10号的门诊数和门诊总费用。首先在目录树存储结构中定位到深圳市南山医院妇产科,妇产科下面存放着一个统计树结构,那么要得到该子查询的统计记录,在统计树的年这一层,将2010年的节点值d减去2008年的节点值b得到数值u;在统计树的月这一层,将父亲节点2008年的节点值b减去2008年5月的节点值h得到数值v,得到2011年2月的节点值k,重命名为w;接着,在统计树的日这一层,将父亲节点2008年5月的节点值h减去2008年5月19号的节点值p得到数值x,得到2011年3月10号的节点值s,重命名为y;最后将u,v,w,x,y五个值相加就得到了子查询的统计记录。\n[0060] 如果统计树的节点不是按照时间顺序完全连续的,那么在计算过程中,找到前一个相邻的节点替代计算节点,当所有的子查询都返回之后,合并子查询的统计记录成用户所期望的统计结果,返回最终的统计记录给用户,定制查询结束,如图4所示。\n[0061] 通过上述方法的实施,就可以迅速定位统计数据的位置,避免大数据量的访问,从而减轻了系统负载,提高了查询效率和访问的并发性。\n[0062] 为了验证数据量的持续增大,查询范围的任意增大,一次统计的算法时间复杂度为常数级,下面以完成一项业务需求为例,即在任意时间段内得到某项目的总统计值,对查询的范围字段(时间,项目)建立索引,并按照时间(年月日)建立统计树数据结构。如此一来,每次进行统计查询时,分别根据索引在“年”这一层搜索起始年的节点值b和终止年前一年的节点值d,在“月”这一层搜索起始月的节点值h和终止月前一月的节点值k,在“日”这一层搜索起始日前一日的节点值p和终止日的节点值s,在最坏的情况下,计算给定时间段某医院某科室的总统计值时,只需另外搜索起始年年末12月的节点值i和起始月月末的节点值q,最后得出总统计值Y为\n[0063] Y=(d-b)+(i-h)+k+(q-p)+s.\n[0064] 因此,整个算法的时间复杂度为常数级,效率明显优于在传统数据库和hbase的实现统计查询。为了进一步验证此算法为常数级,选取了100组测试数据做测试,将每次算法执行所耗时间记录下来,并绘制成图表如图5所示,根据图5:\n[0065] 由于第一次统计时,编译器在第一次连接数据库时便生成查询计划,并将此计划放在缓存中,故耗时较大,在图中显示为1200毫秒左右。从第二次开始以后每次算法执行的耗时都趋于稳定,成线性状,可以验证此统计树算法的时间复杂度为常数级。\n[0066] 另外,若考虑该业务需求带来的空间复杂度,先设该业务项目的总数为M,该业务时间记录总数为T,则针对某一项目,按年月日分层的统计树结构所带来的空间复杂度为即o(T3),故整个统计树算法的空间复杂度为o(M·T3)。\n[0067] 由此可见,本发明实施例所述方法充分利用了原有的统计结果,将海量数据的统计计算转换成每日新增数据的增量计算,通过在每日的闲时更新统计树,实现用户的定制查询仅是作用在一些以B-树为存储结构的统计树上,可以迅速定位统计数据的位置,避免了大数据量的访问,从而减轻了系统负载,提高了查询的效率和访问的并发性。\n[0068] 以具体的实验数据进行分析如下:\n[0069] 数据来源于深圳市46家医院2006年至2010年的医疗数据,为了模拟每日的新增数据,将2010年的最后2个月的数据作为增量数据来处理,数据的内容涉及用户的基础信息,医疗机构的基础信息,病人的就诊记录,病人的检验检测记录,病人的就诊和住院费用等等,源数据被处理后以hdfs或者hbase存储,全部数据的总大小为2.1T。\n[0070] 在本实验中,采用了6台普通服务器搭建了一个hadoop集群的运行环境,每台服务器16个核,16G的内存,8T的磁盘空间。实验证明,在充分发挥hadoop集群的分布式存储和分布式计算能力的情况下,模拟1000人同时在线的不同类型的统计查询,平均的响应时间在\n2s以内。与传统的方法相比,本发明的方法将海量医疗数据的实时统计查询转换为基于统计树的在线查询,可以在更短的时间内支持更加高并发的统计查询请求。因为是采用增量计算来进行统计,所以解决了全量计算时系统负载过高的问题。另外,由于数据是冗余存储的,且hadoop自带了容错机制,因此在系统的高可用性,高稳定性上有着更加明显的优势。\n[0071] 以上所述,仅为本发明较佳的具体实施方式,但本发明的保护范围并不局限于此,任何熟悉本技术领域的技术人员在本发明披露的技术范围内,可轻易想到的变化或替换,都应涵盖在本发明的保护范围之内。因此,本发明的保护范围应该以权利要求书的保护范围为准。
法律信息
- 2016-11-09
- 2013-10-16
实质审查的生效
IPC(主分类): G06F 17/30
专利申请号: 201210587210.6
申请日: 2012.12.28
- 2013-04-17
引用专利(该专利引用了哪些专利)
序号 | 公开(公告)号 | 公开(公告)日 | 申请日 | 专利名称 | 申请人 |
1
| |
2012-06-27
|
2011-12-26
| | |
2
| |
2012-06-20
|
2011-11-17
| | |
被引用专利(该专利被哪些专利引用)
序号 | 公开(公告)号 | 公开(公告)日 | 申请日 | 专利名称 | 申请人 | 该专利没有被任何外部专利所引用! |