如何解决如何在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 举报,一经查实,本站将立刻删除。