Scala _* 到 select 数据框列列表
Scala _* to select a list of dataframe columns
我有一个数据框和一个这样的列列表:
import spark.implicits._
import org.apache.spark.sql.functions._
val df = spark.createDataFrame(Seq(("Java", "20000"), ("Python", "100000"))).toDF("language","users_count")
val data_columns = List("language","users_count").map(x=>col(s"$x"))
为什么这样做:
df.select(data_columns:_ *).show()
但不是这个?
df.select($"language", data_columns:_*).show()
报错:
error: no `: _*' annotation allowed here
(such annotations are only allowed in arguments to *-parameters)
以及如何让它工作以便我可以使用 _* 来 select 列表中的所有列,但我还想在 select 中指定一些其他列?
谢谢!
更新:
根据下面@chinayangyangyong 的回答,我是这样解决的:
df.select( $"language" +: data_columns :_*)
这是因为 Dataframe
上没有带有签名 select(col: Column, cols: Column*): DataFrame
的方法,但是有一个带有签名 select(col: Column*): DataFrame
的方法,这就是您的第一个示例有效的原因。
有趣的是,如果您使用 String
到 select 列,您的第二个示例将起作用,因为有一个方法 select(col: String, cols: String*): DataFrame
.
df.select(data_columns.head, data_columns.tail:_*),show()
我有一个数据框和一个这样的列列表:
import spark.implicits._
import org.apache.spark.sql.functions._
val df = spark.createDataFrame(Seq(("Java", "20000"), ("Python", "100000"))).toDF("language","users_count")
val data_columns = List("language","users_count").map(x=>col(s"$x"))
为什么这样做:
df.select(data_columns:_ *).show()
但不是这个?
df.select($"language", data_columns:_*).show()
报错:
error: no `: _*' annotation allowed here
(such annotations are only allowed in arguments to *-parameters)
以及如何让它工作以便我可以使用 _* 来 select 列表中的所有列,但我还想在 select 中指定一些其他列?
谢谢!
更新:
根据下面@chinayangyangyong 的回答,我是这样解决的:
df.select( $"language" +: data_columns :_*)
这是因为 Dataframe
上没有带有签名 select(col: Column, cols: Column*): DataFrame
的方法,但是有一个带有签名 select(col: Column*): DataFrame
的方法,这就是您的第一个示例有效的原因。
有趣的是,如果您使用 String
到 select 列,您的第二个示例将起作用,因为有一个方法 select(col: String, cols: String*): DataFrame
.
df.select(data_columns.head, data_columns.tail:_*),show()