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

oknrviil  于 2021-07-14  发布在  Spark
关注(0)|答案(2)|浏览(457)

第一个数组: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子句,比如where(a=1和b=2)或(a=3和b=4)或(a=5和b=6)

amrnrhlw

amrnrhlw1#

首先,不要将结构化数据转换为字符串。做 .map(_.toSeq) 收集后,不 toString .
那么,像这样的事情应该会起作用:

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

您可能会发现在repl中一步一步地运行这个命令并查看每一行的作用是很有帮助的。

y4ekin9u

y4ekin9u2#

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

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)

相关问题