分子分析提供了精确和个性化的癌症治疗方案和决策点。通过评估DNA, RNA,蛋白质等,临床团队能够了解疾病的生物学,并为肿瘤患者提供具体的治疗方案。建立了一个包含人口统计学、临床和分子数据的综合数据库,以总结个性化的基因组报告。肿瘤学家能够审查报告,并获得解释结果和潜在治疗计划的协助。支持当前环境的架构包括Wasbi存储、bash/corn/PowerShell、Hive和Office 365 (SharePoint)。通过一个自动化的过程,个性化的基因组数据被交付给医生。当我们支持这种环境时,我们注意到独特的挑战,并为关键业务流水线的下一代制定了计划。
在研究了不同的平台之后,我们觉得Databricks可以bob体育客户端下载帮助我们降低成本,标准化我们的工作流程,并且可以很容易地扩展到大型组织。本演讲将详细介绍之前环境的一些挑战,为什么我们选择Apache Spark和Databricks,迁移计划和经验教训,迁移后使用的新技术(数据工厂/Databricks, PowerApp/Power automation /Logic App, Power BI),以及迁移后业务受到的影响。迁移到Databricks对我们的组织来说是至关重要的,因为数据的时间敏感性和我们组织对肿瘤患者个性化治疗的承诺。
-大家好,我叫维多利亚·莫里斯,是中庭健康公司的独立顾问。中庭健康是美国第二大非营利医疗系统。VA是第一个。今天,我们将通过一个真实世界的案例研究,将我们的基因组管道从HDI配置上的bash Hive迁移到微软Azure Databricks中的Spark。首先,我们将快速概述我们的数据湖,以及为什么我们决定转移到Databricks的一些背景知识。
然后,我们将讨论迁移我们的两个基因组管道。谈谈我们学到的一些东西,以及它对业务的影响。我们重视您的反馈。请不要忘记对课程进行评分和复习。让我们从链接开始。
早在2016年,我们就被要求解决这个问题。基因组报告隐藏在电子病历和扫描报告的深处。我们从多个供应商那里收到它们。它们看起来不一样,而且很长。需要大量的手工工作来总结它们。这些报告给出了一般的临床试验建议,我们的肿瘤中心莱文癌症研究所(LCI)可能提供,也可能不提供。这些建议需要转化为我们具体的可用试验。总之,这是复杂的、耗时的和手工的。
LCI集成知识库或链接的目标是跨组织中的各个数据竖井组合数据。数据湖的一个常见用例。本来我们有四个人,现在只剩下兰斯和我了。Lance在这个项目中的主要关注点是基础设施和与安全部门的谈判,以将数据进入数据湖,并确保我们保持在预算之内。我着重于运行后端的算法,以及开发前端用户界面和任何新的功能请求。此外,我每天都保持管道的平稳运行,在出现任何问题时排除故障。正如您所看到的,我们有各种数据源汇聚到Azure中的数据湖中。所有这些数据都通过算法转换到我们的两个管道中。我们的第一个管线临床试验实际上开始了EA通路。我们在EHR中采用了消防、智能、嵌入式应用程序,用于确保无论治疗地点如何,在使用批准的治疗途径的同时,对患者进行一致的护理。 Providers determine the best possible treatment pathway which may include genomic testing. The clinical trials matching pipeline then takes the results from these two external tests as input, merges it with the other relevant data, knowing about the patient across the data lake to generate clinical trials matching and genomic report summary. The second pipeline is for the pharmacogenomics. It starts from internal genomics testing results where the raw one and two Alleo calls from the internal lab are transformed to the genotype and phenotype. They derive clinical recommendations and then generate a summary report. Here’s a look at the original tools and the data flow that supported the 2016 process. We started diagnostically with bash script that used Cron to control and run jobs. Scoop to gather data, Hive to do the algorithm. We use Ms Web Apps to pull data on an in the cloud SQL server back end that was auto-created by Microsoft, with the front end user interface that was also auto-generated, but was customizable. We used Emma SharePoint designer and PowerShell to move information between SharePoint lists and databases, et cetera. We’re receiving a lot of different data formats. XML, comma-separated value files, PDFs, banned fast keys. We pull full table copies from internal databases and from the Teza, our enterprise data warehouse. We pull queries across multiple tables or full table reads of data in the Azure storage using Scoop. Our pipeline went live in August of 2016, starting as a proof of concept. Over the years, there have been tweaks.
一旦微软停止支持网络应用程序,我们就被要求使用新的Emma 's Power Apps。Power Apps取代了Web Apps, Flow取代了SharePoint设计器和PowerShell。我们添加了额外的入站实验室和更多的数据格式。JSON和RSID文件。我们创建了Azure SQL server数据库来取代自动生成的Web应用程序数据库。在此期间,我们继续维持每天的生产运行,每天多份报告以支持临床用户,以及每周基因组肿瘤委员会。当我们迁移到Databricks时,高端后端已经增长到8000多行。
但就像任何伟大的成功一样,我们也有问题。有超过180名肿瘤学家,药剂师,护士,住院医生,实验室,人们实时使用这些数据来为现实生活中的人做出临床治疗选择的决定,当它因为任何原因停止工作时,这是一件大事。我们是人类发展指数的早期采用者。微软没有想到人们只是打开这些集群,让它们运行多年。在牛和宠物的对比中,我们是一头名叫弗雷德的坏牛。
安全模式一直在杀我们。看起来,我们在早上起床,发现一夜之间一切都失败了,没有错误报告,不得不在脱离安全模式后重新运行几个小时的工作。我们仔细研究了大量的数据。600万病人,每年1200万次的检查,乘以5年的时间来为安排检查的医生找到正确的病人记录。只是在我们开始看结果之前从几个不同的系统中提取病人的所有背景信息。在我们被告知放弃Visual Studio并转向Visual Code之前,我已经破坏了Visual Studio几次。正如我不断被提醒的那样,这是一个昂贵的操作,我们尝试了很多东西来降低成本,比如缩放,我们再次成功地达到了一个隐藏的限制。在设计中隐藏了最大数量的日志,没有人希望您能够达到。但经过这么多年的经营,我同意了。
缩放也带来了很多不稳定性。我们总是有IP地址问题,或者说是缺乏IP地址问题。规模也有负面影响。我们会周期性地丢失IP地址,这些地址从未被自动缩小过程释放。最终,我们将耗尽IP地址,一切都将失败。
下一步的行动。
我们大概知道自己想要什么。我们想要便宜的,不好意思,是价值。我们想留在云端。我们希望在编程语言的选择上有灵活性,我们终于准备好投入微软的怀抱。我们需要一个符合HIPAA的基础设施,它稳定、自给自足,不需要大量的修补。我想要一些东西,让我走出Visual Studio, Visual Code的世界,进入更容易使用的东西,比如笔记本电脑。我们决定转移到Databricks来清理和收集数据。我们引入了数据工厂来移动数据,而不是使用命令行。对我来说,转折点是不再需要亲自管理基础设施。我不是搞硬件的,我是搞软件的。
说到移民。
从小事做起。Databricks的学习曲线非常陡峭,这不仅仅是因为这个管道要求我精通除Databricks之外的许多其他技术,如Power Apps, Data Factory, Power automation, Power BI和SharePoint。所以我们从第二个管道开始,它要小得多,从零开始要容易得多。
药物基因组学是你经常听到的个性化药物。根据你的基因,你的身体可能对药物有不同的反应。你可能需要更高的剂量,或者根本不应该开一些药物。在一个强大的应用程序的驱动下,我们的内部实验室可以生成药物基因组学的实验室结果,并将其转化为报告。在20万英尺的高度,如果你非常熟悉基因组学,请原谅我的解释。基因组学测试你的DNA、RNA的双螺旋切片,并对每一段进行编号。然后将两个双螺旋的备份排列起来,你会得到一个字母,代表四种可能的酸之一。A, T, C或G,在每个位置上的狮子座被称为1,狮子座被称为2。把一堆这样的剪切id结合起来,比如1、2和5,你就得到了一个基因。取决于染色体1号和染色体2号的字母,你有一个基因型或变体,而类型是正常的,或者你是星6号,星6号。 These gene variants distinguish how your body will metabolize medications, and or the efficacy of prescribing a medication to you.
这是我们从实验室收到的RSID文件。我们得到样本ID, NCBI剪辑参考号,1和2调用那些CTG,出于某种原因,还有一个破折号。我不知道,也许是外星人的DNA。真相就在那里。
我们开始这个应用的时候,实验室给我们发了这个电子表格,问我们是否可以创建一个应用来读取这些文件,这些文件来自上一屏,然后用这些Excel电子表格把这些实验室结果的表现型转化成报告。这是该电子表格生成的Power App屏幕。筛选器根据所选择的基因和可能的变异组合进行表型分析。代谢产物被分配。此屏幕根据变量的数量动态重绘。实验室通过应用程序中的其他屏幕自行定义这一切。实验室用户审查患者的结果,并确保它们与他们在机器上看到的结果一致。他们还添加了原始数据中没有的相关信息。这张照片显示了CYP2C19基因,它由这里显示的三个RSID组成。这是特定病人的第1次和第2次呼叫。一旦实验室对结果感到满意,他们就会在结果上签字,然后从队列中退出,跳到临床评审团队的队列中。 Here, the clinical interpretation work two is presenting a patient for review. Staff can add a personalized consult note, edit text, preview the PDF report, sign off the results is complete, and then it drops off their queue. There’s only one notebook for pharmacogenomics. This started from one of my first notebooks. I didn’t know I like Scala. So it’s a Python notebook! No worries, I just change itself as I go. One of the interesting technical challenges to make the proposed workflow for this application to work is that we needed to be able to run this notebook on demand from a button push inside the power app which is accomplished by a power automate called the Data Factory to run the notebook.
好了,回到我们正在编写的8000行Hive代码。
我们有四个外部实验室给我们发送结果。每一个都有自己的格式。这份报告长达15页。我已经把它编辑下来了,如果你愿意的话,这是一个桥梁,这些潜在的临床试验匹配在LCI的临床中可能存在,也可能不存在。请记住,我不确定任何不熟悉基因组学和ASCO下所有临床试验的人甚至可以开始使用这个页面。或者你也可以用这个简单的总结段落,以及符合条件的临床试验段落。是的,这就是那份15页报告的实际结果。临床试验匹配是非常困难的,需要大量的手工工作。医生翻阅病人的病历,查阅他们可能熟悉或不熟悉的各种可能的临床试验所需要的东西,这是非常困难的。通过自动化这一过程,提供临床决策支持,我们提高了提供者将患者与临床试验相匹配的能力。 Why is increasing clinical trial participation important? Well, from it being part of Atrium Health 2020 goals, advances in care. Clinical trials are how we test and make changes to treatments that improve care and outcomes. Patients get care to reduce costs. Atrium Health gets revenue for participating in a clinical trial, and physicians get prestige and recognition for getting their names associated with clinical trials. So it’s a win, win, win. Being able to match clinical trials against these 10 criteria flexibly with no hard coding is a very non-trivial accomplishment. We’ve been looking at commercial matching projects, products which have extremely limited numbers of genes and criteria, all hard coded with about a two week development cycle for each individual clinical trial. Here at Atrium, we have a couple of 100 clinical trials open at any given point in time, with lots of movement, opening and closing of trials daily at Atrium.
我们使用Power Apps为员工管理和维护他们想要的匹配方式,以及在摘要中应该显示哪些信息以及它应该如何显示。我们尽量不把任何东西硬编码到算法中。都是由这些表的特性决定的。他们可以实时操控。今天所做的任何更改都是明天运行的一部分。不需要IAS干预。希望是一个友好的,易于使用的界面。这些是我们要描述的复杂关系。重新设计的很大一部分使它更简单,更容易输入临床试验数据。临床试验有父母记录、姓名和其他相关数据,如年龄、范围、状态、性别。 Clinical trial criteria allow us to branch for multiple genes. A clinical trial may have one clinical trial criteria or many. Asker taper has over a 100, for example, but there are lots with just one or two.
临床试验的标准,孩子的记录有一个基因来匹配结果,标准化机器的结果对于每个特征,比如肿瘤部位,我们有两种可能的状态。我想要大多数东西只有少数例外包括任何接受的东西,比如橙色的肿瘤按钮,或者我想要一些东西,我想要排除大部分,就是绿色诊断按钮中发生的事情。只列出这个简短的清单。按钮文本的变化以及显示在每个按钮下面的集合,这些集合总结了在其他屏幕上所做的选择。按下按钮,导航到一个新屏幕,为该特性定义包含和排除标准。对于实验结果,您需要一个大于、小于或等于的运算符和一个值。由于我们从多个实验室获得结果,测量单位可能会有差异。大多数都是像这个例子一样的化妆品,但你可以用完全不同的测量尺度,比如每升十克和每十升微摩尔。所以血红蛋白可以在正常值为120或使用其他刻度12时进行测量。总的来说,如果想要统计匹配,可以使用红色滑块定义。 If you meet any of those lab results, or you can flip the switch and acquire all the labs to be considered. The large, gray button changes the overall logic which is currently only include these, that shortlist of include, but you could say include any, except what I define here.
还有这个,这是总结结果模板页。一旦我们拥有了正确的数据,最重要的方面之一就是如何将数据显示给提供者。Farhangfar博士非常注重细节,这也是她在工作中表现出色的原因。她可以自行决定是否显示每种技术的结果,甚至只显示特定技术上的特定基因的特定结果。她精确地定义了标题,以及她想在细节行中显示的变量。同样,没有IIS干预,这也是服务。她所做的任何改变都将在明天的比赛中看到。在本例中,应该显示来自清洁T7技术的任何突变的致病基因,Databricks在计算摘要时将用尖括号内的数字代替生物标志物和NGS蛋白变化的实际值。这个是针对这个特定的基因,TMB,并且只针对这个结果,只在这个技术中。帧移位并不重要,不需要显示在摘要中。 So those results are removed from you. Display on the summary is independent of clinical trials matching. Once we finish clinical trials matching, we add to the bottom of the summary, any results that would not normally be displayed in the summary. So it makes sense to the provider reading why there was a match. A good example as wild types. We do not display wild types in the summary unless they’re used to match a clinical trial.
报告审查允许您对算法的结果进行管理。在这里,您可以使用紫色按钮打开原始完整的PDF,您可以在下表中看到原机结果导出到摘要。橙色按钮可以让你在需要调整某些内容时快速移动到应用程序的另一部分,比如它应该如何显示或匹配标准。使用这两个编辑控件,您可以手动覆盖该患者的算法结果。我们定期回顾手动更新,可以看到算法的输出,对算法进行持续的改进。
所以所有的数据,XML, CSV, JSON,数据表读取,SQL轮询输入到Azure的数据湖,在那里Databricks运行到笔记本。从用户在power应用程序中编辑的Azure SQL数据库表中读入特性,并将其与数据湖数据结合,生成结果。将它们上传到数据湖或Azure SQL server数据库,管理员可以使用power应用程序查看和发布。power自动化流程移动文档并更新SharePoint列表。Power BI从SQL server数据库读取数据并更新其视图。发送电子邮件,表明有工作提示或提供新的报告。所有这些都是一个相互联系的生态系统的力量。Azure上的Databricks与Office 365。
大迁徙。
对于Databricks,我们将工作分解为几个独立的笔记本。对于每个实验室,首先每个实验室都有一个单独的笔记本,用于读取他们特定的输入数据,XML、CSV、JSON,并将其转换为用于匹配和创建摘要的标准格式。这使我们能够独立运行实验室笔记本,因为每天的节奏和时间,我们从每个实验室得到的数据是不同的。然后还有第二个笔记本,用于临床试验的匹配,第三个笔记本用于总结。这是因为每个笔记本电脑都有一个最佳销量。当你超过100时,你会得到糟糕的性能警告。这似乎是一个很好的逻辑中断,把东西放在这里,以减少任何返工或重新加载表数据。模块化的特性也使得故障排除比8000行Hive代码容易得多。您必须让整个脚本运行,因为试图调试的所有事情都是一种折磨。现在我可以重新运行一个本地组,一个逻辑组,比如一个实验室和主匹配检查更改,或者只是摘要检查显示模板的问题。
我最初在Hive中创建了这个算法。因为我们把Hive表当作数据帧来处理,所以它实际上很容易转换。当然,也有一些不同之处。在Hive中,我必须创建一个表定义,它存储在数据库中,而在Databricks中,我需要有一个模式来读取数据。在逗号分隔的值数据中没有标头,而且随着时间的推移,数据发生了变化。2020年我们将获得比2016年更多的油田。所以我不能依赖任何推断选项。还有几个额外的步骤来让SQL的情绪。在Databricks中,我有一个单独的Python行,使用预定义的模式将数据读入数据帧,然后从Python将数据帧保存到一个表中。
然后事情开始变得非常相似。通常,我们所做的转换只是复制和粘贴,但这也是一个重新思考一些原始选择的机会,并通过重新做一些新版本中的逻辑来改进算法。
Databricks笔记本管理已连接到它们的集群。这是我的救星。集群可以根据工作负载上下扩展工作节点,您可以预先定义要附加到用于笔记本的集群的库。我更喜欢用Scala编写,但我可以在每个单元格中切换语言。尽管我尽可能地坚持矩阵操作,正如Lance所说,有时你只需要一个循环。
数据由数字组成。我们使用优质的工作空间。我们有大约110tb的数据。230万个基因结果乘以大约240个临床试验标准,乘以每天每个临床试验的10个特征。因为我们每天都会重新计算今天所有病人的临床试验匹配度因为试验开始和结束,病人的资格会发生变化。是的,即使在COVID-19期间,我们仍然每天大约有一份新报告。
我们学到的东西。
Azure密钥库。完全值得花时间来设置,特别是当您将Databricks笔记本扩展到多个人时。你不需要所有这些凭证,它们都是纯文本的。保存一份最终的工作详细说明是很重要的,因为只有当你创建一个全新的工作空间时,你才需要重做,这种情况并不常见,你会忘记。说到创建一个全新的工作空间,如果你出乎意料地这么做,你就会失去一切。我知道,这很老派,也很老派,但是定期在离线状态下保存你正在做的事情的完整副本。是的,在这个项目中,我们不得不两次生成新的工作空间。
处理复杂、深度、嵌套的JSON和XML非常糟糕。
我的意思是,在他们给你的那些可爱的小例子中,它看起来很棒,但大多数现实世界中,自描述数据是混乱的,你可能有或没有节点,可能有或没有重复,你需要把它都塞进结构化的表中,对它做任何事情。红衣主教来拯救我们。我一直使用这个函数来查看这些复杂数组中是否有任何数据,这些数组可能包含数据,也可能不包含数据。另一个方便的函数是concat with string。它允许您连接字符串或数组,或将两者组合成字符串。因此,如果您不确定您的数据中是否有一个山丘或多年的结果,因为它像生活一样复杂和混乱,您可以将未知转换为最终字符串,以便将所有内容整齐地放入结构化表中。我通常使用管道分离器,这样我就可以在事后挖掘许多条目。
这是一个艰难的教训。数据只读取块blob。其他血型,它都看不到目录。数据工厂是一个很好的工具。我们只是没有像我们想象的那样经常使用它。我不是专家,但我一直在用这个。如果你在Python中创建了一个数据帧,然后突然需要在Scala中使用它,除非你转换它,否则你无法看到它。我使用SQL在Python和Scala之间进行转换,我直接在Spark SQL中做了很多工作。
我们不再挖掘相对较小的数据源,只要不妨碍生产,就直接连接到表。这工作得很好,它是中等规模的代码片段。但是如果你停止或运行,或者癌症在写表格的过程中出现,你就会把它完全冲洗掉。您只需底部代码片段来修复它。这将清理文件系统,允许您尝试再次写入表。由于我们设计的模块化性质,我保存了最终结果,这样我就可以将转换和计算从一个笔记本转移到另一个笔记本。然后,我使用刷新表特性提取表的最新、真实值版本,而不管在集群中兑现了什么。我喜欢拼花。我们从中获得了很多速度增益。但是如果您使用的是真实世界的数据,那么您最终可能会得到Parquet讨厌的无列定义。 Early on, after the initial read of incoming unstructured data, I usually cast any numeric column to its true type and float double as part of a transformation to avoid getting all the way through the script and hitting a knoll-typed column error from hurricane when I’m saving the final results to a table.
业务影响。更稳定,钱更少。如果你有故障,排除故障要容易得多。增加体积或易于处理。我们从一个600个基因面板到一个完整的转录组,从一个菜单中报告,甚至没有眨眼,最终用户是独立的。
我要感谢拉加文博士,我们宴会的创始人。作为LCI的负责人,他作为主要调查员为所有数据收集提供资金、指导和监管批准。我们的客户Farhangfar博士,Nury和Jai,在IAS方面,如果没有Chris Danzi, Lance, Scott,这是不可能的。Andy, Andrea Bouronich, Stephanie, Melanie, Stacy, Kelly Jones和他的团队,以及所有允许我们访问他们数据的数据系统所有者,以及所有帮助我们提升优势的微软支持人员。数据,当然,感谢你们今天的时间和注意力。
中庭健康
维多利亚·莫里斯拥有戏剧表演学士学位,所以她自然而然地获得了信息系统硕士学位。她在不同的组织中处理数据的时间已经长得记不清了。在进入医疗保健行业之前,她负责编码彩票和彩票,包括为独特的填字游戏扩展游戏编写算法。她进一步挑战自我,致力于为加拿大北部和美国的货物运输和商品定价确定动态物流路线。维多利亚在过去十年中一直从事医疗保健工作,专注于肿瘤学和急诊医学的整合。她曾在美国、加拿大和澳大利亚工作过,为各种医疗保健系统的内部运作和几个主要的EHR带来了独特的经验。维多利亚热衷于通过自动化消除护理障碍,使医疗保健提供者及其患者的生活更轻松。