Динамически генерировать фильтр из последовательности столбцов и значений - PullRequest
0 голосов
/ 17 сентября 2018

Предположим, у меня есть последовательность столбцов, и у меня также есть последовательность одинаковой длины, соответствующей определенному значению для каждого столбца.

Я хочу отфильтровать кадр данных, когда каждый столбец равен его соответствующемузначение в seq.

Циклы по столбцам и итеративная фильтрация кажутся неэффективными, но, возможно, у меня нездоровая неприязнь к циклам for, так как я раньше был программистом R.

Является ли цикл for лучшим способом решения этой проблемы или есть хороший способ превратить последовательности в столбец, который фильтрует, как следует?

Код выглядит примерно так:

val df = data.frame(a=1:3,b=1:3,c=1:3) //use R syntax here for brevity
val cols = Seq($"a",$"b",$"c")
val vals = Seq(1, 2, 3)
val filteredDf = df
cols.map(case(col, i) => filteredDf = filteredDf.filter(col = vals[i]))

1 Ответ

0 голосов
/ 18 сентября 2018

Вы можете отобразить каждый кортеж столбца и значения в условие, а затем использовать reduce с функцией Column.and для создания одного условия, которое проверяет все столбцы.

Затем используйте filterс этим условием:

import org.apache.spark.sql.functions._
import spark.implicits._

val condition = cols.zip(vals)
  .map { case (c, v) => c.equalTo(lit(v)) }
  .reduce(_ and _)

val result = df.filter(condition)

Например:

df.show()
// +---+---+---+
// |  a|  b|  c|
// +---+---+---+
// |  1|  2|  3|
// |  1|  3|  5|
// +---+---+---+

result.show()
// +---+---+---+
// |  a|  b|  c|
// +---+---+---+
// |  1|  2|  3|
// +---+---+---+
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...