如何使用scala在sparkDataframe中使用正则表达式?

mi7gmzs6  于 2021-05-29  发布在  Spark
关注(0)|答案(1)|浏览(633)

在我的例子中,我有一个包含一些生物数据的数据框,这些数据是:蛋白质名称、ecnumber(可能不止一个)和蛋白质域(也可能不止一个域)。数据框是一列,包含所有这些数据,我想将其拆分为三列,但问题是,如果拆分一行(包含多个ecnumber),则第二个ecnumber将转到第三列,然后域将消失。
这是我的密码:

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")

这是输入图像描述的结果

watbbzwu

watbbzwu1#

根据提供的引用数据,我发现您可以使用以下正则表达式将数据检索到独立的列中(通过使用正则表达式进行提取):

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

例如,如果Dataframe值具有以下值:

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

现在使用正则表达式,可以从Dataframe值中提取独立值:

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

上图:将在相应的变量中检索所有值:1.)条目:条目字符串2.)ecnumbers:由分号分隔的完整ecnumbers字符串。字符串末尾将出现分号。
3.)域:用分号分隔的完整域字符串。
注意:如果由于任何原因,Dataframe值不是预期的值,则会引发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]"))

相关问题