如何将spark列的别名获取为string?

zzlelutf  于 2021-05-27  发布在  Spark
关注(0)|答案(2)|浏览(481)

如果我在 val ,如下所示:

import org.apache.spark.sql.functions._
val col: org.apache.spark.sql.Column = count("*").as("col_name")
``` `col` 属于类型 `org.apache.spark.sql.Column` . 有办法查到它的名字吗( `"col_name"` )? 比如:

col.getName() // returns "col_name"

在这种情况下, `col.toString` 退货 `"count(1) AS col_name"` 
bmvo0sr5

bmvo0sr51#

试试下面的代码。

scala> val cl = count("*").as("col_name")
cl: org.apache.spark.sql.Column = count(1) AS `col_name`
scala> cl.expr.argString
res14: String = col_name
scala> cl.expr.productElement(1).asInstanceOf[String]
res24: String = col_name
scala> val cl = count("*").cast("string").as("column_name")
cl: org.apache.spark.sql.Column = CAST(count(1) AS STRING) AS `column_name`

scala> cl.expr.argString
res113: String = column_name

如果你改变 .as & .cast 它会给你错误的结果。
你也可以使用 json4s 提取 nameexpr.toJSON ```
scala> import org.json4s._
import org.json4s._

scala> import org.json4s.jackson.JsonMethods._
import org.json4s.jackson.JsonMethods._

scala> implicit val formats = DefaultFormats
formats: org.json4s.DefaultFormats.type = org.json4s.DefaultFormats$@16cccda5

scala> val cl = count("*").as("column_name").cast("string") // Used cast last.
cl: org.apache.spark.sql.Column = CAST(count(1) AS column_name AS STRING)

scala> (parse(cl.expr.toJSON) \ "name").extract[String]
res104: String = column_name

toiithl6

toiithl62#

另一个简单的方法是,列名总是被``这些字符覆盖。您可以使用regex或拆分字符串并获取 index 1 元素。
split ,

col.toString.split("`")(1)

用正则表达式,

val pattern = "`(.*)`".r
pattern.findFirstMatchIn(col.toString).get.group(1)

这样做的好处是你甚至包括 .cast("string") 对你来说,它仍然有效。

相关问题