Как использовать массив внутри другого массива в scala, чтобы использовать каждый элемент из одного массива для добавления к соответствующему элементу из другого массива?

#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 любого символа» — и так же делает просто . 😀 Или (.) , если вы хотите группу.