繁体   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