scala - 使用折叠连接所有数据框列,使用 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 就足够了,但我很好奇折叠等如何工作。
解决方案
这绝对不是要走的路*,但如果你把它当作一个编程练习:
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 已经提供的东西,这是一个复杂的解决方案。
- 因为它需要计划器/优化器的额外工作来展平递归表达式,更不用说表达式不使用尾调用递归并且可以简单地溢出。
推荐阅读
- azure - Azure QnA:错误“此区域中的此订阅不允许进行缩放操作。请尝试选择不同的区域或缩放选项。”
- c# - iText7 无法设置日志记录
- vba - 我的 VBA 代码在 Office 2007 中不起作用
- c# - Unity:将 Texture2D 转换为 YUV420P 并使用 FFmpeg 使用 UDP 发送
- android - getExternalStorageState.listFiles() 返回 null
- python-3.x - Selenium Python:execute_script 在循环中只执行一次
- python-3.x - 由于逗号,语法无效
- xml - 模板匹配和属性到节点
- javascript - 为什么我的 websocket php+javascript 代码不起作用?
- java - 将选择的日期时间对话框选择器转换为存储在 sqlite DB 中