False / True Константа столбца - PullRequest
       3

False / True Константа столбца

0 голосов
/ 12 февраля 2020

TL; DR : мне нужна эта искровая постоянная:

val False : Column = lit(1) === lit(0)

Есть идеи, как сделать это красивее?

Контекст проблемы

Я хочу отфильтровать кадр данных из коллекции. Например:

case class Condition(column: String, value: String)

val conditions = Seq(
  Condition("name", "bob"),
  Condition("age", 18)
)

val personsDF = Seq(
  ("bob", 30),
  ("anna", 20),
  ("jack", 18)
).toDF("name", "age")

При применении моей коллекции к PersonDF я ожидаю:

val expected = Seq(
  ("bob", 30),
  ("jack", 18)
)

. Для этого я создаю фильтр из коллекции и применяю его к фрейму данных:

val conditionsFilter = conditions.foldLeft(initialValue) {
  case (cumulatedFilter, Condition(column, value)) =>
    cumulatedFilter || col(column) === value
}

personsDF.filter(conditionsFilter)

Довольно мило, верно?

Но для этого мне нужно нейтральное значение оператора ИЛИ - False. Поскольку False не существует, это Spark, который я использовал:

val False : Column = lit(1) === lit(0)

Есть идеи, как это сделать без уловок?

1 Ответ

3 голосов
/ 12 февраля 2020

Вы можете просто сделать:

val False : Column = lit(false)

Это должно быть вашим initialValue, верно? Вы можете избежать этого, используя head и tail:

val buildCondition = (c:Condition) => col(c.column)===c.value

val initialValue = buildCondition(conditions.head)

val conditionsFilter = conditions.tail.foldLeft(initialValue)(
  (cumulatedFilter, condition) =>
    cumulatedFilter || buildCondition(condition)
)

Еще короче, вы можете использовать reduce:

val buildCondition = (c:Condition) => col(c.column)===c.value

val conditionsFilter = conditions.map(buildCondition).reduce(_ or _)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...