apache-spark - usando - lista desplegable excel autocompletar
Upacking una lista para seleccionar varias columnas de un marco de datos de chispa (5)
Otra opción que acabo de aprender.
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:_*)
Tengo un marco de datos de chispa df
. ¿Hay alguna forma de seleccionar algunas columnas usando una lista de estas columnas?
scala> df.columns
res0: Array[String] = Array("a", "b", "c", "d")
Sé que puedo hacer algo como df.select("b", "c")
. Pero supongamos que tengo una lista que contiene algunos nombres de columna val cols = List("b", "c")
, ¿hay alguna manera de pasar esto a df.select? df.select(cols)
arroja un error. Algo así como df.select(*cols)
como en python
Puede encasillar Cadena para centellear columna de esta manera:
import org.apache.spark.sql.functions._
df.select(cols.map(col): _*)
Puede pasar argumentos de tipo Column*
para 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:_*)
Utilice df.select(cols.head, cols.tail: _*)
Déjame saber si funciona :)
La clave es la firma del método de seleccionar:
select(col: String, cols: String*)
La entrada cols:String*
toma una cantidad variable de argumentos. :_*
descomprime argumentos para que puedan ser manejados por este argumento. Muy similar al desempaquetado en python con *args
. Vea here y here para otros ejemplos.
puedes hacer esto
String[] originCols = ds.columns();
ds.selectExpr(originCols)
spark selectExp código fuente
/**
* 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))
}: _*)
}