apache-spark-sql - 如何从键值映射中提取值,火花数据框
问题描述
我有一个带有地图的列,其中键和值发生了变化。我正在尝试提取值并创建一个新列。输入
---------------+
|symbols |
+---------------+
|[3pea -> 3PEA] |
|[barello -> BA]|
|[] |
|[] |
+---------------+
预期产出
---------------+
|symbols |
+---------------+
|3PEA |
|BA |
| |
| |
+---------------+
这是我到目前为止使用 UDF 尝试过的
def map_value=udf((inputMap:Map[String,String])=> {inputMap.map(x=>x._2)
})
但这给了我
java.lang.UnsupportedOperationException: Schema for type scala.collection.immutable.Iterable[String] is not supported
解决方案
import org.apache.spark.sql.functions._
import spark.implicits._
val m = Seq(Array("A -> abc"), Array("B -> 0.11856755943424617"), Array("C -> kqcams"))
val df = m.toDF("map_data")
df.show
// Simulate your data I think.
val df2 = df.withColumn("xxx", split(concat_ws("",$"map_data"), "-> ")).select($"xxx".getItem(1).as("map_val")).drop("xxx")
df2.show(false)
结果是:
+--------------------+
| map_data|
+--------------------+
| [A -> abc]|
|[B -> 0.118567559...|
| [C -> kqcams]|
+--------------------+
+-------------------+
|map_val |
+-------------------+
|abc |
|0.11856755943424617|
|kqcams |
+-------------------+
推荐阅读
- java - 事务性更改集合中的记录
- php - Laravel (v5.7) Passport (v7.0) 在尝试打开 auth api 路由时将我重定向到登录屏幕
- ios - 测试快速调用函数的计时器
- wordpress - 如何在 WordLift 中将 JSON-LD `@type` 从 `Article` 更改为 `NewsArticle`
- google-bigquery - 如何在 bigquery 中构建视图以实现高效的访问管理
- javascript - JavaScript 适用于一个 id 而不是另一个?
- php - 使用 xmlhttp.open() 从一个 php 文件到另一个文件的 PHP 变量
- android - Android 应用在首次发布时在 Google Play 商店中被暂停
- javascript - 电子打包时是否包含 --save-dev 模块?如果是这样,我怎样才能将它们全部排除?
- memory - 缺少 Prometheus 容器级缓冲内存指标