从 spark 数据框中将列表解包为 select 多列
Upacking a list to select multiple columns from a spark data frame
我有一个 spark 数据框 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)
使用df.select(cols.head, cols.tail: _*)
让我知道它是否有效:)
:
关键是select的方法签名:
select(col: String, cols: String*)
cols:String*
条目采用可变数量的参数。 :_*
解压参数以便它们可以被这个参数处理。与在 python 中使用 *args
解包非常相似。有关其他示例,请参阅 here and here。
您可以像这样将字符串类型转换为 spark 列:
import org.apache.spark.sql.functions._
df.select(cols.map(col): _*)
我刚刚学到的另一个选项。
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:_*)
您可以将 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:_*)
你可以这样做
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))
}: _*)
}
是的,您可以在 scala 中使用 .select。
使用 .head 和 .tail 来 select List( )
例子
val cols = List("b", "c")
df.select(cols.head,cols.tail: _*)
首先将字符串数组转换为如下所示的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 函数转换列表,如下所示。您需要以下导入语句。
import scala.collection.JavaConversions;
Dataset<Row> selectedDF = df.select(JavaConversions.asScalaBuffer(colNames ));
fast 根据您的要求列出多项功能。
然后 select 来自数据框,带有 wild *from list.
lst = ["col1", "col2", "col3"]
result = df.select(*lst)
如果您遇到 AnalysisException: cannot resolve 'clo1
' given input columns 然后尝试:
这个:-
from pyspark.sql.functions import lit
from pyspark.sql.types import StringType
for i in lst:
if i not in df.columns:
df = df.withColumn(i, lit(None).cast(StringType()))
我有一个 spark 数据框 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)
使用df.select(cols.head, cols.tail: _*)
让我知道它是否有效:)
关键是select的方法签名:
select(col: String, cols: String*)
cols:String*
条目采用可变数量的参数。 :_*
解压参数以便它们可以被这个参数处理。与在 python 中使用 *args
解包非常相似。有关其他示例,请参阅 here and here。
您可以像这样将字符串类型转换为 spark 列:
import org.apache.spark.sql.functions._
df.select(cols.map(col): _*)
我刚刚学到的另一个选项。
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:_*)
您可以将 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:_*)
你可以这样做
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))
}: _*)
}
是的,您可以在 scala 中使用 .select。
使用 .head 和 .tail 来 select List( )
例子
val cols = List("b", "c")
df.select(cols.head,cols.tail: _*)
首先将字符串数组转换为如下所示的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 函数转换列表,如下所示。您需要以下导入语句。
import scala.collection.JavaConversions;
Dataset<Row> selectedDF = df.select(JavaConversions.asScalaBuffer(colNames ));
fast 根据您的要求列出多项功能。 然后 select 来自数据框,带有 wild *from list.
lst = ["col1", "col2", "col3"]
result = df.select(*lst)
如果您遇到 AnalysisException: cannot resolve 'clo1
' given input columns 然后尝试:
这个:-
from pyspark.sql.functions import lit
from pyspark.sql.types import StringType
for i in lst:
if i not in df.columns:
df = df.withColumn(i, lit(None).cast(StringType()))