解压缩列表以从火花数据框中选择多个列

问题描述 投票:38回答:7

我有一个火花数据框架df。有没有办法使用这些列的列表选择几列?

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

我知道我可以做像df.select("b", "c")这样的事情。但是假设我有一个包含几个列名val cols = List("b", "c")的列表,有没有办法将它传递给df.select? df.select(cols)抛出错误。像python中的df.select(*cols)之类的东西

apache-spark apache-spark-sql spark-dataframe
7个回答
76
投票

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

让我知道它是否有效:)

Explanation from @Ben

关键是select的方法签名:

select(col: String, cols: String*)

cols:String*条目采用可变数量的参数。 :_*解包参数,以便可以通过此参数处理它们。非常类似于使用*args在python中解压缩。有关其他示例,请参阅herehere


19
投票

您可以将String类型转换为spark列,如下所示:

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

17
投票

我刚刚学到的另一种选择。

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

2
投票

您可以将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:_*)

1
投票

你可以这样做

String[] originCols = ds.columns();
ds.selectExpr(originCols)

spark selectExp源代码

     /**
   * 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
投票

是的,您可以在scala中使用.select。

使用.head和.tail选择List()中提到的整个值

val cols = List("b", "c")
df.select(cols.head,cols.tail: _*)

Explanation


0
投票

首先将String Array转换为Spark数据集列类型,如下所示

String[] strColNameArray = new String[]{"a", "b", "c", "d"};

List<Column> colNames = new ArrayList<>();

for(String strColName : strColNameArray){
    colNames.add(new Column(strColName));
}

然后使用select语句中的JavaConversions函数转换List,如下所示。您需要以下import语句。

import scala.collection.JavaConversions;

Dataset<Row> selectedDF = df.select(JavaConversions.asScalaBuffer(colNames ));
© www.soinside.com 2019 - 2024. All rights reserved.