【问题标题】:Spark Select with a List of Columns Scala带有列列表的 Spark 选择 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: _*)

标签: scala apache-spark


【解决方案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: _*)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-29
    • 1970-01-01
    • 2020-05-24
    • 1970-01-01
    • 1970-01-01
    • 2018-01-02
    • 1970-01-01
    相关资源
    最近更新 更多