首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在spark scala中根据匹配条件从列名中提取数字?

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

Stack Overflow用户
提问于 2020-09-23 00:43:15
回答 2查看 64关注 0票数 1

我有一个像这样的数据框架,

代码语言:javascript
复制
  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中只有一列以个体开始,以业余结束,且该列的规则编号为2。

我该怎么做呢?

非常感谢!祝你今天过得愉快。

EN

回答 2

Stack Overflow用户

发布于 2020-09-23 01:40:33

可以使用df.columns提取列名

代码语言:javascript
复制
df.columns
// Array[String] = Array(individual_rule_1_professional, individual_rule_2_amateur, team_rule_3_professional, team_rule_4_amateur, total)

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

代码语言:javascript
复制
df.columns.filter(_.matches("individual_.*_amateur")).map(_.replaceAll("[^\\d]", ""))
// Array[String] = Array(2)
票数 1
EN

Stack Overflow用户

发布于 2020-09-23 02:25:24

以下是另一种解决方案:

代码语言:javascript
复制
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的答案的区别:

如果单词“Array[String]

  • Avoids”后面没有紧跟_字符(但仍然假设分隔符是_字符),则
  • 将输出Array[Int]而不是_任何问题。这更符合您指定的列名:"...start with“和"...end with"
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64014174

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档