首页 > 解决方案 > 使用折叠连接所有数据框列,使用 Spark / Scala 减少

问题描述

以下适用于动态列生成:

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

标签: scalaapache-spark

解决方案


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

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 已经提供的东西,这是一个复杂的解决方案。
  • 因为它需要计划器/优化器的额外工作来展平递归表达式,更不用说表达式不使用尾调用递归并且可以简单地溢出。

推荐阅读