使用带有键 -> 列名的 Map 在数据框上触发选择列

Posted

技术标签:

【中文标题】使用带有键 -> 列名的 Map 在数据框上触发选择列【英文标题】:Spark select columns on dataframe using a Map with key -> column name 【发布时间】:2020-02-27 07:37:12 【问题描述】:

我正在使用 Apache spark 2.3.0 cloudera4,但在根据地图中的值选择特定列时遇到问题。

我有这些输入,一个数据框:

+---+---+---+...+
| id| c1| c2| cN|
+---+---+---+...+
|  a|1.0|2.0|...|
|  a|3.0|4.0|...|
|  b|5.0|6.0|...|
|  c|7.0|8.0|...|
+---+---+---+---+

每个“c”列都是双精度类型。

还有一张地图:

Map("a" -> "c1", "b" -> "c2", "c" -> "c1")

我需要这个输出:

+---+---+
| id|  c|
+---+---+
|  a|1.0|
|  a|3.0|
|  b|6.0|
|  c|7.0|
+---+---+

从性能的角度来看,获得输出的最佳方式是什么?

现在我正在遍历映射键,使用 where 子句选择值 col 和 id 列,并与上一步进行联合(第一步是使用空数据框进行的)。我认为这种操作正在惩罚我的流程性能。

【问题讨论】:

【参考方案1】:

这里应该不需要使用union,与coalesce一起迭代map变量就足够了。这将根据id 列和字典中的值选择正确的列:

import spark.implicits._

val m = Map("a" -> "c1", "b" -> "c2", "c" -> "c1")
val c = coalesce(m.mapcase (k,v) => when($"id" === k, col(v)).otherwise(lit(null)).toSeq: _*)

df.select($"id", c)

【讨论】:

太棒了!处理时间减少 50% @la.leiva: 乐于助人:)

以上是关于使用带有键 -> 列名的 Map 在数据框上触发选择列的主要内容,如果未能解决你的问题,请参考以下文章

使用带有排序组合框和页面组合框上的许多项目的列表视图

组合框上 KeyDown 的签名

使用 ORM,我可以将带有 a、b、c 列的 DB 表映射到带有带有键 a、b、c 的 Map 的类吗?

仅使用带有键的 unordered_map 来存储指针(忽略值)

如何修复 SqlException:列名无效

禁用特定文本框上的输入键