【问题标题】:Concat of all data frame columns using fold, reduce with Spark / Scala使用折叠连接所有数据框列,使用 Spark / Scala 减少
【发布时间】:2019-02-04 21:40:55
【问题描述】:

以下内容适用于动态列生成:

import org.apache.spark.sql.functions._
import sqlContext.implicits._
import org.apache.spark.sql.DataFrame

val input = sc.parallelize(Seq(
   ("a", "5a", "7w", "9", "a12", "a13") 
   )).toDF("ID", "var1", "var2", "var3", "var4", "var5")

val columns_to_concat = input.columns
input.select(concat(columns_to_concat.map(c => col(c)): _*).as("concat_column")).show(false)

返回:

+-------------+
|concat_column|
+-------------+
|a5a7w9a12a13 |
+-------------+

如何使用 foldLeft, reduceLeft 做到这一点 - 同时保留动态列生成?

我总是收到错误或返回空值。虽然 concat 就足够了,但我很好奇 fold 等如何工作。

【问题讨论】:

    标签: scala apache-spark


    【解决方案1】:

    这绝对不是要走的路*,但如果你把它当作编程练习:

    import org.apache.spark.sql.functions.{col, concat, lit}
    
    columns_to_concat.map(col(_)).reduce(concat(_, _))
    

    或

    columns_to_concat.map(col(_)).foldLeft(lit(""))(concat(_, _))
    

    * 因为

    • 对于已经由高级 API 提供的东西,这是一个复杂的解决方案。
    • 因为它需要计划器/优化器的额外工作来展平递归表达式,更不用说表达式不使用尾调用递归并且可能会简单地溢出。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-02-04
      • 1970-01-01
      • 2015-06-05
      • 1970-01-01
      • 2014-05-29
      • 2021-09-02
      • 2021-10-20
      • 1970-01-01
      相关资源
      最近更新 更多