微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何在scala中使用另一个数组中的数组,以便使用一个数组中的每个元素附加到另一个数组中的相应元素?

如何解决如何在scala中使用另一个数组中的数组,以便使用一个数组中的每个元素附加到另一个数组中的相应元素?

一个数组: var keyColumns = "A,B".split(",")

第二个数组: var colValues = DataFrameTest.select("Y","Z").collect.map(row => row.toString) colValues: Array[String]= Array([1,2],[3,4],[5,6])

我想要这样的结果: 数组([A=1,B=2],[A=3,B=4],[A=5,B=6])

以便稍后我可以遍历这个数组并可以创建我的 where 子句,例如 在哪里 (A=1 AND B=2) OR (A=3 AND B=4) OR (A=5 AND B=6)

解决方法

首先,不要将结构化数据转换为字符串。收集后做.map(_.toSeq),而不是toString

然后,这样的事情应该可以工作:

   colValues
     .map { _ zip keyColumns } 
     .map { _.map { case (v,k) => s"$k=$v" } }
     .map { _.mkString("("," AND ",")") }
     .mkString(" OR ")

您可能会发现在 REPL 中逐步运行此步骤并查看每一行的作用会很有帮助。

,

您可以使用正则表达式,例如:

scala> val keyColumns = "A,B".split(",")
keyColumns: Array[String] = Array(A,B)

scala> val colValues = "[1,2] [3,4] [5,6]".split(" ")
colValues: Array[String] = Array([1,2],[3,4],[5,6])

scala> val pattern = """^\[(.{1}),(.{1})\]$""".r //here,(.{1}) determines a regex group of exactly 1 any char
pattern: scala.util.matching.Regex = ^\[(.{1}),(.{1})\]$

scala> colValues.map { e => pattern.findFirstMatchIn(e).map { m => s"(${keyColumns(0)}=${m.group(1)} AND ${keyColumns(1)}=${m.group(2)})" }.getOrElse(e) }.mkString(" OR ")
res0: String = (A=1 AND B=2) OR (A=3 AND B=4) OR (A=5 AND B=6)

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。