web-dev-qa-db-fra.com

Décompresser une liste pour sélectionner plusieurs colonnes dans un cadre de données spark

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

36
Ben

Utilisez df.select(cols.head, cols.tail: _*)

Laissez-moi savoir si cela fonctionne :)

Explication de @Ben :

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.

64
Shagun Sodhani

Vous pouvez typecast String pour spark colonne comme ceci:

import org.Apache.spark.sql.functions._
df.select(cols.map(col): _*)
18

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:_*)
15
vEdwardpc

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:_*)
2
raam86

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))
    }: _*)
  }
1
geosmart

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: _*)

Explication

0
Unmesha SreeVeni