Upakowanie listy w celu wybrania wielu kolumn z ramki danych spark

Mam ramkę danych spark df. Czy istnieje sposób na podwyzszenie kilku kolumn za pomoca listy tych kolumn?

scala> df.columns
res0: Array[String] = Array("a", "b", "c", "d")

Wiem, że mogę zrobić coś takiego df.select("b", "c"). Ale załóżmy, że mam listę zawierającą kilka nazw kolumn val cols = List("b", "c"), czy istnieje sposób, aby przekazać to do df.wybrać? df.select(cols) wyrzuca błąd. Coś w stylu df.select(*cols) jak w Pythonie

Author: Prasad Khode, 2016-01-22

5 answers

Użyj df.select(cols.head, cols.tail: _*)

Daj znać, czy to działa:)

Wyjaśnienie od @ Ben :

Kluczem jest podpis metody select:

select(col: String, cols: String*)

Wpis cols:String* pobiera zmienną liczbę argumentów. :_* rozpakowuje argumenty tak, aby mogły być obsługiwane przez ten argument. Bardzo podobne do rozpakowywania w Pythonie za pomocą *args. Zobacz tutaj i tutaj dla innych przykładów.

 58
Author: Shagun Sodhani,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-10-29 21:31:56

Możesz wpisać String do kolumny spark w następujący sposób:

import org.apache.spark.sql.functions._
df.select(cols.map(col): _*)
 17
Author: Kshitij Kulshrestha,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-07-12 05:58:39

Kolejna opcja, której się właśnie nauczyłem.

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:_*)
 14
Author: vEdwardpc,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-10-01 20:33:35

Możesz przekazać argumenty typu Column* do 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:_*)
 1
Author: raam86,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-01-16 13:41:07

You can do like this

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))
    }: _*)
  }
 0
Author: geosmart,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-05-10 06:21:27