使用折叠连接所有数据框列,并通过Spark / Scala减少

时间:2019-02-04 21:40:56

标签: 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")

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足够了,但我对折叠等如何工作感到好奇。

1 个答案:

答案 0 :(得分:2)

这绝对不是路要走的路 *,但是如果您将其视为编程练习,则:

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已经提供的复杂解决方案。
  • 因为需要计划者/优化器进行额外的工作才能使递归表达式扁平化,更不用说该表达式不使用尾调用递归并且可以简单地溢出。