带有列列表的 Spark 选择 Scala
Posted
技术标签:
【中文标题】带有列列表的 Spark 选择 Scala【英文标题】:Spark Select with a List of Columns Scala 【发布时间】:2016-10-07 05:13:58 【问题描述】:我正在尝试找到一种使用 List[Column] 进行火花选择的好方法,我正在爆炸一列而不是通过我的爆炸列传回我感兴趣的所有列。
var columns = getColumns(x) // Returns a List[Column]
tempDf.select(columns) //trying to get
我知道,如果它是一个字符串,我可以做类似的事情
val result = dataframe.select(columnNames.head, columnNames.tail: _*)
【问题讨论】:
您使用的是哪个版本的 Spark? 1.6.0 提供def select(cols: Column*): DataFrame
应该做你想做的事?
我使用的是 2.0.0。我将如何利用它,因为我尝试选择一个列表 [Column] 和 Seq [Column]。这些都不起作用,我也看到了这种方法,但我无法使用它。我将如何分解该调用中的列表以使用它?
val result = dataframe.select(columns: _*)
【参考方案1】:
对于 spark 2.0 似乎你有两个选择。两者都取决于您如何管理列(字符串或列)。
Spark 代码(spark-sql_2.11/org/apache/spark/sql/Dataset.scala):
def select(cols: Column*): DataFrame = withPlan
Project(cols.map(_.named), logicalPlan)
def select(col: String, cols: String*): DataFrame = select((col +: cols).map(Column(_)) : _*)
您可以看到 spark 内部如何将您的 head & tail
转换为要再次调用的列列表 Select
。
所以,如果你想要一个清晰的代码,我会推荐:
如果列:列表[字符串]:
import org.apache.spark.sql.functions.col
df.select(columns.map(col): _*)
否则,如果列:列表[列]:
df.select(columns: _*)
【讨论】:
以上是关于带有列列表的 Spark 选择 Scala的主要内容,如果未能解决你的问题,请参考以下文章
Spark Dataframe - 计算列之间的对(Scala)
Spark DataFrame - 使用 Java API 选择列列表