scala - 使用 Scala 将多列转换为 Spark Dataframe 上的一列地图
问题描述
我有一个具有可变列数的数据框,例如 Col1、Col2、Col3。我需要使用下面的代码将 Col1 和 Col2 组合成一列数据类型映射。
val df_converted = df.withColumn("ConvertedCols", map(lit("Col1"), col("Col1"), lit("Col2"), col("Col2")))
但是,当我不知道列的数量和名称时,如何对所有列执行此操作?
解决方案
一种方法是将 DataFrame 的列列表通过扩展flatMap
为 aSeq(lit(c1), col(c1), lit(c2), col(c2), ...)
并应用 Spark 的映射,如下所示:
import org.apache.spark.sql.functions._
import spark.implicits._
val df = Seq(
("a", "b", "c", "d"),
("e", "f", "g", "h")
).toDF("c1", "c2", "c3", "c4")
val kvCols = df.columns.flatMap(c => Seq(lit(c), col(c)))
df.withColumn("ConvertedCols", map(kvCols: _*)).show(false)
// +---+---+---+---+---------------------------------------+
// |c1 |c2 |c3 |c4 |ConvertedCols |
// +---+---+---+---+---------------------------------------+
// |a |b |c |d |Map(c1 -> a, c2 -> b, c3 -> c, c4 -> d)|
// |e |f |g |h |Map(c1 -> e, c2 -> f, c3 -> g, c4 -> h)|
// +---+---+---+---+---------------------------------------+
推荐阅读
- java - 如何使用 selenium 切换到特定窗口
- dictionary - 在巨大的 clojure 映射中过滤不必要的键
- android - HorizontalListView - 如何获取图像视图源
- sql - 动态 SQL--嵌套 Replace() 函数
- kubernetes - 如何将此 Traefik 示例部署到 Kubernetes?
- python - Numpy searchsorted 没有按预期工作
- macos - 可以使用 Cmd+c 复制 vim 选择吗?
- webpack-4 - Webpack 多个块包含相同的依赖项
- python - 收到一条错误消息,显示“无法将非有限值(NA 或 inf)转换为整数”,尽管我没有任何无穷大或 NA 值
- sql - 重命名枚举值会导致“找不到类型关系”