使用fold对所有数据框列进行压缩,使用Spark/Scala减少

使用fold对所有数据框列进行压缩,使用Spark/Scala减少,scala,apache-spark,Scala,Apache Spark,以下内容适用于动态列生成: 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

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

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等如何工作。

这肯定不是一个好办法*,但如果您将其视为编程练习:

import org.apache.spark.sql.functions.{col, concat, lit}

columns_to_concat.map(col(_)).reduce(concat(_, _))


*因为

  • 这是一个复杂的解决方案,它已经由一个高级API提供
  • 因为它需要规划师/优化器做额外的工作来展平递归表达式,更不用说表达式不使用尾部调用递归,并且可能会溢出
这绝对不是一条可行之路*,但如果您将其视为编程练习:

import org.apache.spark.sql.functions.{col, concat, lit}

columns_to_concat.map(col(_)).reduce(concat(_, _))


*因为

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