天天看點

【譯】使用Spark SQL 運作大規模基因組工作流原文連結:編譯:使用Spark SQL 運作大規模基因組工作流資料讀取基因組資料的使用資料導出下一步是什麼

原文連結:

https://databricks.com/blog/2019/06/26/scaling-genomic-workflows-with-spark-sql-bgen-and-vcf-readers.html

編譯:

誠曆,阿裡巴巴計算平台事業部 EMR 技術專家,Apache Sentry PMC,Apache Commons Committer,目前從事開源大資料存儲和優化方面的工作。

使用Spark SQL 運作大規模基因組工作流

【譯】使用Spark SQL 運作大規模基因組工作流原文連結:編譯:使用Spark SQL 運作大規模基因組工作流資料讀取基因組資料的使用資料導出下一步是什麼

在過去十年中,随着基因組測序價格下降,可用基因組資料的數量逐漸激增。研究人員現在已經能夠從英國生物銀行等項目的數十萬人群中探測遺傳變異和疾病之間的關聯。這些分析将使人們更深入地了解疾病的根本原因,進而治療當今一些主要的疾病問題。但是,目前用來分析這些資料集的工具還沒有跟上資料增長的步伐。

許多使用者習慣于使用指令行工具(如plink或單節點Python和R腳本)來處理基因組資料。但是,單節點工具暫時還不足以達到TB級甚至更進階别的程度。 目前Broad研究所的Hail項目建立在Spark之上,可以将計算配置設定到多個節點,但它要求使用者除了Spark之外還要學習新的API,并鼓勵資料以特定于Hail的檔案格式存儲。由于基因組資料不是孤立地保持其價值,而是針對結合不同資料來源(例如醫療記錄,保險索賠和醫學圖像)進行分析後的一種輸入,是以單獨的系統可能導緻嚴重的并發症。

我們相信Spark SQL已經成為處理各種不同風格的大量資料集的标準,代表了通向簡單、可擴充的基因組工作流程的最直接途徑。 Spark SQL用于以分布式方式來對(ETL)大資料進行提取,轉換和加載。 ETL是生物資訊學所涉及工作的90%,從提取突變,用外部資料源注釋,到為下遊統計和機器學習分析做準備。 Spark SQL包含Python或R等語言的進階API,這些API易于學習,并且比傳統的生物資訊學方法更容易閱讀和維護代碼。

在這篇文章中,我們将介紹在基因組資料和Spark SQL之間提供強大及靈活連接配接的資料Reader和Writer。

資料讀取

Reader是Spark SQL中的資料源,是以VCF和BGEN可以像任何其他檔案類型一樣被讀入Spark

DataFrame。 在Python中,VCF檔案的目錄讀取如下所示:

.format("com.databricks.vcf")\

  .option("includeSampleIds", True)\

  .option("flattenInfoFields", True)\

  .load("/databricks-datasets/genomics/1kg-vcfs")           

VCF頭中定義的資料類型将轉換為輸出DataFrame的架構。 此示例中的VCF檔案包含許多成為可查詢字段的注釋:

【譯】使用Spark SQL 運作大規模基因組工作流原文連結:編譯:使用Spark SQL 運作大規模基因組工作流資料讀取基因組資料的使用資料導出下一步是什麼

Spark SQL DataFrame 中VCF檔案的内容

适用于群組中每個樣本的字段(如被調用的基因型)存儲在一個數組中,這樣可以為每個站點的所有樣本實作快速聚合。

【譯】使用Spark SQL 運作大規模基因組工作流原文連結:編譯:使用Spark SQL 運作大規模基因組工作流資料讀取基因組資料的使用資料導出下一步是什麼

每個樣本基因型字段的數組

由于那些使用VCF檔案的人都非常清楚,VCF規範為資料格式化帶來了歧義,這可能導緻工具以意想不到的方式失敗。 我們的目标是建立一個強大的解決方案,預設情況下接受格式錯誤的記錄,然後允許我們的使用者選擇過濾條件。 例如,我們的一位客戶使用我們的讀者來攝取有問題的檔案,其中一些機率值被存儲為“nan”而不是“NaN”,這是大多數基于Java的工具所需要的。 自動處理這些簡單問題使我們的使用者可以專注于了解他們的資料意味着什麼,而不是資料是否為正确格式化的。 為了驗證我們讀者的穩健性,我們針對由GATK和Edico Genomics等常用工具生成的VCF檔案以及資料共享計劃中的檔案對其進行了測試。

諸如英國生物銀行倡議分發的BGEN檔案也可以類似地處理。 讀取BGEN檔案的代碼與我們的VCF示例幾乎完全相同:

spark.read.format("com.databricks.bgen").load(bgen_path)
           

這些檔案讀取器生成相容的模式,允許使用者編寫适用于不同變異資料源的管道,并支援合并不同的基因組資料集。 例如,VCF閱讀器可以擷取具有不同INFO字段的檔案目錄,并傳回包含公共字段的單個DataFrame。 以下指令讀入BGEN和VCF檔案中的資料并合并它們以建立單個資料集:

bgen_df = spark.read.format(“com.databricks.bgen”)\

   .schema(vcf_df.schema).load(bgen_path)

big_df = vcf_df.union(bgen_df) # All my genotypes!!           

由于我們的檔案閱讀器傳回vanilla Spark SQL DataFrames,您可以使用Spark支援的任何程式設計語言(如Python,R,Scala,Java或純SQL)來提取變體資料。 專門的前端API,例如Koalas,它在Apache Spark上實作了pandas資料幀API,并且還可以無縫地工作。

基因組資料的使用

由于每個變體級注釋(VCF中的INFO字段)對應于DataFrame列,是以查詢可以輕松通路這些值。 例如,我們可以計算小等位基因頻率小于0.05的雙等位基因變體的數量:

【譯】使用Spark SQL 運作大規模基因組工作流原文連結:編譯:使用Spark SQL 運作大規模基因組工作流資料讀取基因組資料的使用資料導出下一步是什麼

Spark 2.4引入了高階函數,簡化了對數組資料的查詢。 我們可以利用此功能來操縱基因型陣列。 要過濾基因型數組,使其僅包含至少有一個變異等位基因的樣本,我們可以編寫如下查詢:

【譯】使用Spark SQL 運作大規模基因組工作流原文連結:編譯:使用Spark SQL 運作大規模基因組工作流資料讀取基因組資料的使用資料導出下一步是什麼

使用更高階函數操作基因型數組

如果您有VCF檔案的tabix索引,我們的資料源會将基因組軌迹上的過濾器推送到索引并最大限度地降低I / O成本。 即使資料集增長超出單個機器可以支援的大小,簡單查詢仍然以互動速度完成。

正如我們在讨論攝取變體資料時所提到的,Spark支援的任何語言都可用于編寫查詢。 以上語句可以組合成單個SQL查詢:

【譯】使用Spark SQL 運作大規模基因組工作流原文連結:編譯:使用Spark SQL 運作大規模基因組工作流資料讀取基因組資料的使用資料導出下一步是什麼

使用SQL查詢VCF檔案

資料導出

我們相信,在不久的将來,組織将使用Delta Lake等技術存儲和管理基因組資料,就像處理其他資料類型一樣。 但是,我們知道向後相容熟悉的檔案格式以便與協作者共享或使用傳統工具非常重要。

我們可以在我們的過濾示例的基礎上建立一個塊gzip壓縮檔案,其中包含等位基因頻率小于5%的所有變體:

.orderBy(“contigName”, “start”)\

    .write.format(“com.databricks.bigvcf”)\

    .save(“output.vcf.bgz”)           

此指令并行對輸出VCF的每個段進行排序,序列化和上載,是以您可以安全地輸出群組規模的VCF。 每個染色體或甚至更小的粒度也可以輸出一個VCF。

将相同資料儲存到BGEN檔案隻需要對代碼進行一次小修改:

.orderBy(“contigName”, “start”)\

    .write.format(“com.databricks.bigbgen”)\

    .save(“output.bgen”)           

下一步是什麼

将資料提取到Spark中是大多數大資料作業的第一步,但這并不是大資料旅途的終點。

在接下來的幾周内,我們将有更多部落格文章,展示如何在這些讀者和作者之上建構的功能可以擴充和簡化基因組工作負載。 敬請關注!

【譯】使用Spark SQL 運作大規模基因組工作流原文連結:編譯:使用Spark SQL 運作大規模基因組工作流資料讀取基因組資料的使用資料導出下一步是什麼

繼續閱讀