如何在scala中的另一个数组中使用一个数组,以便使用一个数组中的每个元素附加到另一个数组中的相应元素?
Posted
技术标签:
【中文标题】如何在scala中的另一个数组中使用一个数组,以便使用一个数组中的每个元素附加到另一个数组中的相应元素?【英文标题】:How to use an array inside another array in scala in order to use each element from one array to append to corresponding element from other array? 【发布时间】:2021-07-04 14:13:23 【问题描述】:第一个数组: 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)
【问题讨论】:
【参考方案1】:首先,不要将结构化数据转换为字符串。在收集后执行.map(_.toSeq)
,而不是toString
。
然后,这样的事情应该可以工作:
colValues
.map _ zip keyColumns
.map _.map case (v,k) => s"$k=$v"
.map _.mkString("(", " AND ", ")")
.mkString(" OR ")
您可能会发现在 REPL 中逐步运行此程序并查看每一行的作用很有帮助。
【讨论】:
感谢您的回复和代码sn-p。它有帮助,但 .join 不起作用,'value join 不是 Seq [String] 的成员' 我尝试使用 map 代替 join .map _.map e => e.split(",") .mkString(" AND ") 它不会抛出任何错误,但它什么也没做。当在类似的字符串上显式尝试时,它可以工作,但不能在链式转换中。 呃,对不起...mksString
,不是join
...我总是在不同的语言之间混淆:)我会更新答案。【参考方案2】:
你可以使用正则表达式,比如:
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)
【讨论】:
以上是关于如何在scala中的另一个数组中使用一个数组,以便使用一个数组中的每个元素附加到另一个数组中的相应元素?的主要内容,如果未能解决你的问题,请参考以下文章
如何将数据存储在动态二维数组中,该数组在 C++ 中的另一个结构中也使用的结构中声明
如果一个数组包含使用 BigQuery 的另一个数组的所有值,我如何过滤行?
在java中,如何在int数组中为该数组中的另一个值添加值?