#arrays #scala #apache-spark #nested-loops #scala-collections
Вопрос:
первый массив: var KeyColumns = «A,B».разделение(«,»)
второй массив: значения var = DataFrameTest.select(«Y»,»Z»).collect.map(строка => строка.toString) Значения: Массив[Строка]= Массив([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)
Ответ №1:
Во-первых, не преобразуйте структурированные данные в строки. Делать .map(_.toSeq)
после сбора, нет toString
.
Тогда что-то вроде этого должно сработать:
colValues
.map { _ zip keyColumns }
.map { _.map { case (v,k) => s"$k=$v" } }
.map { _.mkString("(", " AND ", ")") }
.mkString(" OR ")
Возможно, вам будет полезно выполнить этот шаг за шагом в REPL и посмотреть, что делает каждая строка.
Комментарии:
1. Спасибо за ответ и фрагмент кода. Это помогает, но . соединение не работает, «соединение значений не является членом Seq[String]»Я попытался использовать карту, как показано ниже, вместо join .map { _.map { e => e.split («,»). mkString («И»)} Это не вызывает никаких ошибок, но ничего не делает. При явной попытке использовать аналогичную строку она работает, но не внутри цепных преобразований.
2. тьфу, извини …
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)
Комментарии:
1. «(. {1}) определяет группу регулярных выражений ровно из 1 любого символа» — и так же делает просто
.
😀 Или(.)
, если вы хотите группу.