J'ai un cadre de données d'allumage df
. Existe-t-il un moyen de sélectionner quelques colonnes en utilisant une liste de ces colonnes?
scala> df.columns
res0: Array[String] = Array("a", "b", "c", "d")
Je sais que je peux faire quelque chose comme df.select("b", "c")
. Mais supposons que j'ai une liste contenant quelques noms de colonnes val cols = List("b", "c")
, y a-t-il un moyen de le transmettre à df.select? df.select(cols)
génère une erreur. Quelque chose comme df.select(*cols)
comme en python
Utilisez df.select(cols.head, cols.tail: _*)
Laissez-moi savoir si cela fonctionne :)
La clé est la signature de méthode de select:
select(col: String, cols: String*)
L'entrée cols:String*
prend un nombre variable d'arguments. :_*
décompresse les arguments afin qu'ils puissent être gérés par cet argument. Très similaire à la décompression en python avec *args
. Voir ici et ici pour d'autres exemples.
Vous pouvez typecast String pour spark colonne comme ceci:
import org.Apache.spark.sql.functions._
df.select(cols.map(col): _*)
Une autre option que je viens d'apprendre.
import org.Apache.spark.sql.functions.col
val columns = Seq[String]("col1", "col2", "col3")
val colNames = columns.map(name => col(name))
val df = df.select(colNames:_*)
Vous pouvez passer des arguments de type Column*
à select
:
val df = spark.read.json("example.json")
val cols: List[String] = List("a", "b")
//convert string to Column
val col: List[Column] = cols.map(df(_))
df.select(col:_*)
tu peux faire comme ça
String[] originCols = ds.columns();
ds.selectExpr(originCols)
spark selectExp source code
/**
* Selects a set of SQL expressions. This is a variant of `select` that accepts
* SQL expressions.
*
* {{{
* // The following are equivalent:
* ds.selectExpr("colA", "colB as newName", "abs(colC)")
* ds.select(expr("colA"), expr("colB as newName"), expr("abs(colC)"))
* }}}
*
* @group untypedrel
* @since 2.0.0
*/
@scala.annotation.varargs
def selectExpr(exprs: String*): DataFrame = {
select(exprs.map { expr =>
Column(sparkSession.sessionState.sqlParser.parseExpression(expr))
}: _*)
}
Oui, vous pouvez utiliser .select dans scala.
Utilisez .head et .tail pour sélectionner toutes les valeurs mentionnées dans la liste List ()
Exemple
val cols = List("b", "c")
df.select(cols.head,cols.tail: _*)