簡體   English   中英

如何使用 scala 在火花 dataframe 中使用正則表達式?

[英]How to use regular expression in spark dataframe using scala?

在我的例子中,我有一個包含一些生物學數據的數據框,這些數據是:蛋白質名稱、ecnumber(可能不止一個)和蛋白質域(也可能不止一個域)。 數據框是一列,其中包含我想將其拆分為三列的所有數據,但問題是如果拆分了一行(包含多個 EC 編號),則第二個 EC 編號轉到第三列並且然后域將消失。

這是我的代碼:

val df = rdd.toDF()
val mydf = df.withColumn("_tmp", split($"value", ";")).select(
  $"_tmp".getItem(0).as("Entry"),
  $"_tmp".getItem(1).as("ECnumber"),
  $"_tmp".getItem(2).as("Domains")

這是結果在此處輸入圖像描述

根據提供的參考數據,我看到您可以使用以下正則表達式將數據檢索到獨立列中(通過使用正則表達式提取):

val dataFrameValueRegex = "(\\w++);(([0-9.-]*+;)++)((\\w++;?)++)".r

例如,如果數據框值具有以下內容:

val dataFrameValue = "A6MML6;2.1.-.-;2.1.3.16;IPR037431;IPR037432;IPR037433"

現在使用正則表達式,您可以從數據框 value 中提取獨立值

val dataFrameValueRegex(entry, ecNumbers, _, domains, _) = dataFrameValue

上圖:將在相應的變量中檢索所有值: 1.) entry:條目字符串 2.) ecNumbers:由分號分隔的完整的 ecnumber 字符串。 字符串末尾會有一個分號。
3.) 域:由分號分隔的完整域字符串。

注意:如果由於任何原因數據框值與預期不符,您將拋出 MatchError 異常。

在下面的代碼中只打印變量信息。

println(s"Data value: Entry = [$entry], ECnumbers = [${ecNumbers.init}], Domains = [$domains]")

val ecNumber = ecNumbers.init.split(";")
ecNumber.foreach(e => println(s"ecNumber = [$e]"))

val domain = domains.split(";")
domain.foreach(d => println(s"Domain = [$d]"))

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM