【问题标题】:Converting Column of Dataframe to Seq[Columns] Scala将 Dataframe 的列转换为 Seq[Columns] Scala
【发布时间】:2018-11-29 10:25:16
【问题描述】:

我正在尝试进行下一个操作:

var test = df.groupBy(keys.map(col(_)): _*).agg(sequence.head, sequence.tail: _*)

我知道 agg 中的必需参数应该是 Seq[Columns]

然后我有一个包含下一个的数据框“expr”:

sequences
count(col("colname1"),"*")
count(col("colname2"),"*")
count(col("colname3"),"*")
count(col("colname4"),"*")

列序列是字符串类型,我想使用每一行的值作为agg 的输入,但我无法达到这些值。

知道如何尝试一下吗?

【问题讨论】:

  • 如果 expr 数据框包含 SQL 命令,则可以转换为列。否则,查找列名并在之后应用 colcount 可能会更容易。
  • 表达式是用scala格式写的 sum(when(col("Column").like("Value"), col("Column")) 就是一个例子,所以我认为expr方式不适合这里。我不太理解你所说的第二种方法。你能提供一个简单的例子吗?或者一个扩展的解释,谢谢
  • 第二种方法只有在表达式相同但在不同列上时才可行(如问题中所示)。从您的评论看来,表达方式有所不同。
  • 关于“如果 expr 数据框包含 SQL 命令,则可以转换为列”您到底指的是什么?例如我可以有 sum(CASE WHEN "column" LIKE "value" THEN "Column" END) AS alias 一个 SQL 表达式
  • 是的,这是可能的。我添加了一个答案来更详细地解释它。

标签: scala apache-spark dataframe aggregation


【解决方案1】:

如果能把sequences列的字符串改成SQL命令,就可以解决了。 Spark 提供了一个函数expr,它接受一个 SQL 字符串并将其转换为一列。带有工作命令的示例数据框:

val df2 = Seq("sum(case when A like 2 then A end) as A", "count(B) as B").toDF("sequences")

要将数据帧转换为Seq[Column]s,请执行以下操作:

val seqs = df2.as[String].collect().map(expr(_))

然后是groupByagg

df.groupBy(...).agg(seqs.head, seqs.tail:_*)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-29
    • 2021-08-31
    • 1970-01-01
    • 2016-08-22
    • 1970-01-01
    • 2014-12-31
    相关资源
    最近更新 更多