scala - 有没有办法使用火花数据框根据列条件从地图中获取键?
问题描述
我有以下数据框:
val df = Seq(
(Map("a" -> "1", "b" -> "2", "c" -> "3"), Seq("a","b"))
).toDF("internalMap","commonList")
df.show()
+------------------------+----------+
|internalMap |commonList|
+------------------------+----------+
|[a -> 1, b -> 2, c -> 3]|[a, b] |
+------------------------+----------+
如何获取 interalMap 值,其中键数组等于 valueList 数组?
我曾尝试使用:
val getMapElements = df.select(map_keys(col("internalMap")).as("internalMapKeys"), map_values(col("internalMap")).as("internalMapValues"))
getMapElements.show()
+---------------+-----------------+
|internalMapKeys|internalMapValues|
+---------------+-----------------+
| [a, b, c]| [1, 2, 3]|
+---------------+-----------------+
getMapElements.select("internalMapValues").where(col("commonList") isin col("internalMapKeys")).show()
+-----------------+
|internalMapValues|
+-----------------+
+-----------------+
但它返回一个空数组。预期的是:
+-----------------+
|internalMapValues|
+-----------------+
| [1, 2]|
+-----------------+
最困难的是,在我的用例中只接受 spark 数据框函数。
预先感谢您的帮助
解决方案
使用expr
,transform
函数来获得预期的结果。检查下面的代码。
scala> df
.withColumn(
"internalMapValues",
expr("transform(commonList,v -> internalMap[v])") // Pass commonList value to map as key.
)
.show(false)
+------------------------+----------+-----------------+
|internalMap |commonList|internalMapValues|
+------------------------+----------+-----------------+
|[a -> 1, b -> 2, c -> 3]|[a, b] |[1, 2] |
+------------------------+----------+-----------------+
推荐阅读
- sql - trim、replace、left trim的函数解释SQL顺序
- docker - Kubernetes Pod 重启问题异常
- mysql - mysql中的行值应该是一一对应的
- servlets - 如何处理 URL 中带有 # 字符的 HTTP 请求
- cytoscape.js - 如何在 Cytoscape.JS 中淡化边缘?
- google-bigquery - 需要将字符串从一列分隔为多列,以';'分隔 bigquery中的分隔符
- python - Keras 训练一维数据向量
- javascript - 在javascript中触发点击事件有效,但实际的asp.net事件不会被触发
- c++ - C++ warning: division of double by zero
- javascript - 如何使用 JS/jQuery 在某个点插入 html 元素