如何根据spark scala中的匹配条件从列名中提取数字?

92vpleto  于 2021-05-26  发布在  Spark
关注(0)|答案(2)|浏览(528)

我有这样一个Dataframe,

val df = Seq((12,14,56,22,18),(11,54,83,91,12)).toDF("individual_rule_1_professional",
"individual_rule_2_amateur","team_rule_3_professional","team_rule_4_amateur","total")

我想把以单个开始,以业余结束的列的规则数提取到一个数组中。所以在本例中,它将返回[2],因为在Dataframe中只有一列以individual开头,以Aboutery结尾,而该列的规则号是2。
我该怎么做?
非常感谢!祝你有美好的一天。

bvhaajcl

bvhaajcl1#

下面是另一种解决方案:

df.columns.filter(c => c.startsWith("individual") && c.endsWith("amateur"))
  .flatMap(_.split('_').flatMap(_.toIntOption))
  //or if the number you want is always in the second position
  //.flatMap(_.split('_')(2).toIntOption)
//res1: Array[Int] = Array(2)

与@phlantorvert答案的区别:
输出an Array[Int] 而不是 Array[String] 避免任何问题,如果“个人”一词后面没有一个 _ 字符(但仍假定分隔符为 _ 字符)。这更符合您的规范,即列名应为“…start with”和“…end with”

pprl5pva

pprl5pva2#

可以使用 df.columns ```
df.columns
// Array[String] = Array(individual_rule_1_professional, individual_rule_2_amateur, team_rule_3_professional, team_rule_4_amateur, total)

然后对其应用基本模式匹配来提取规则编号(我假设它始终是一个数字)

df.columns.filter(.matches("individual.*amateur")).map(.replaceAll("[^\d]", ""))
// Array[String] = Array(2)

相关问题