Spark, Scala и Eval выражения преобразования строки - PullRequest
0 голосов
/ 08 ноября 2018

У меня есть следующая логика преобразования Spark DataFrame:

val newCols = df.schema.map {
    dfColumn =>

        val colName = dfColumn.name
        val column = col(colName)

        colName match {
        case "country" => when(column === "Italy", "[ITALY]")
            .when(column === "France", "*France*")
            .otherwise(column).as("[COUNTRY]")
        case "email" => column.as("(EMAIL)")
        case _       => column
    }
}

В соответствии с логикой приложения мне нужно уметь определять логику преобразования для каждого столбца, например:

 when(column === "Italy", "[ITALY]")
.when(column === "France", "*France*")
.otherwise(column)

вне приложения Spark, например, в пользовательском интерфейсе приложения (запишите его в виде простого текста в HTML TextArea), а затем передайте это выражение преобразования в виде строки в приложение Spark и оцените его там.

Возможно ли это со Scala и Spark, и если да, не могли бы вы показать пример?

1 Ответ

0 голосов
/ 08 ноября 2018

Вы можете запускать запросы к фреймам данных, используя альтернативный API ниже:

Зарегистрировать фрейм данных как временную таблицу

df.registerTempTable("myTable")

Затем выполнить запрос к нему:

spark.sql("select a as b from myTable")

Таким образом, вы можете получить выражения для каждого столбца, из которого вы выбираете, как строки, где бы вы ни были, построить SQL-запрос и выполнить, как указано выше ...

Вы можете построить запрос примерно так ...

def buildQuery(columns: Seq[String], table: String): String {
   columns.mkString("select ", ", ", s" from $table")
}

val columns = Seq(
   """a as b""",
   """<some more complex case statement>""",
   // etc.
)

def buildQuery(columns: Seq[String], table: String): String {
   columns.mkString("select ", ", ", s" from $table")
}

df.sql(buildQuery(columns, "myTable"))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...