Spark,Scala和字符串转换表达式的评估

时间:2018-11-08 14:54:19

标签: scala apache-spark

我有以下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应用程序外部,例如在应用程序UI上(在HTML TextArea中将其写为纯文本),然后将此转换表达式作为String传递给Spark应用程序并在其中进行评估。

Scala和Spark是否可行?如果可以,请举个例子吗?

1 个答案:

答案 0 :(得分:1)

您可以使用以下备用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"))