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
5 answers
Użyj df.select(cols.head, cols.tail: _*)
Daj znać, czy to działa:)
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.
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): _*)
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:_*)
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:_*)
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))
}: _*)
}
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