Механизм разработки правил для информационных фреймов, исключающий лестницу if-else в Scala - PullRequest
0 голосов
/ 08 апреля 2020

Я хочу добавить один столбец ("new_col"). в кадре данных, основанном на других правилах, который вычисляется из существующих столбцов. Правила сложны и иногда вычисляются на основе 4-5 столбцов данных. Пожалуйста, обратитесь к фрагменту ниже:

old dataframe = df(A,B,C,D,E,F,G,H)

new dataframe = old_dataframe.withcolums("new_col", myudf(col(A),col(B),col(C),col(D),col(E)))

entries in col(new_col) is computed as following:

def myudf(A,B,C,D,E): String = {
    if (A=="something") {
          if (B="something") {
            return val1
          } else {
            if (C>"something" || D<"something") {
             return val2
            }
            else {
              return func(E)
            }
          }
        } else {
         return val3
        }
      }
}

В настоящее время я написал UDF, который принимает все необходимые столбцы и возвращает значение нового столбца, который будет добавлен. Но проблема в том, что функция udf стала довольно сложной из-за большего количества правил и стала лестницей if-else. Я хочу избежать этого и думаю о рефакторинге, если это возможно. Я также посмотрел на другие ответы, чтобы избежать «если-еще», но для этого информационного кадра ни одно из решений не обсуждается.

Кто-нибудь может подсказать, есть ли какой-нибудь изящный способ написания таких правил для фреймов данных в scala?

1 Ответ

1 голос
/ 08 апреля 2020

Почему бы вам не попробовать сопоставление с образцом? Это более понятно, чем использование if и elses

   (A,B, C, D) match {
    case ("something", "something", _, _)=> val1
    case ("something", _, cValue, dValue) if cValue > "something" || dValue <"something" => val2
    case ("something", _, _, _ ) => func(E)
    case _ => val3
  }
...