带有列列表的 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 scala 从列表中选择多列和单列

Scala(Spark)-当列是列表时如何分组

Spark DataFrame - 使用 Java API 选择列列表

Spark/Scala:对带有数组类型列的 DataFrame 中的某些组件的操作

Spark(scala):groupby和聚合值列表到一个基于索引的列表[重复]