我有以下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是否可行?如果可以,请举个例子吗?
答案 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"))