【问题标题】:Spark, Scala and eval of string transformation expression字符串转换表达式的 Spark、Scala 和 eval
【发布时间】:2018-11-09 02:56:37
【问题描述】:

我有以下 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 中的纯文本),然后将此转换表达式作为字符串传递给 Spark 应用程序并在那里对其进行评估。

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

【问题讨论】:

    标签: scala apache-spark


    【解决方案1】:

    您可以使用以下替代 API 对 Dataframe 运行查询:

    将数据框注册为临时表

    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"))
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-12-12
      • 2012-09-14
      相关资源
      最近更新 更多