如何访问存储在scala spark中的数据框中的映射值和键
Posted
技术标签:
【中文标题】如何访问存储在scala spark中的数据框中的映射值和键【英文标题】:how to access map values and keys stored in a data frame in scala spark 【发布时间】:2018-05-22 09:35:13 【问题描述】:我有一张表,描述如下:
# col_name data_type comment
id string
persona_model map<string,struct<score:double,tag:string>>
# Partition Information
# col_name data_type comment
process_date string
示例行将是这样的(制表符分隔):
000000E91010441BB122402A45D439E7 "Tech":"score":0.21678,"tag":"OTHERS" 2018-05-16-01
现在我想形成另一个表,其中只有 2 列 id
及其各自的 score
。
我如何在 scala spark 中做到这一点?
此外,真正困扰我的是如何仅访问特定的 score
以及如何将其存储在整数变量中,比如说 temp
?
【问题讨论】:
炸开地图,从struct中选择分数 您能否提供示例输入、预期输出以及您尝试过的内容? @RameshMaharjan 我已经编辑并添加了一个示例,我想将该分数 0.21278 存储在变量整数 temp 中该怎么办?而且我还想创建一个包含所有 id 和分数的新表。请帮忙 能不能按照表格格式来格式化输入数据? @RameshMaharjan 它实际上是按照表格格式格式化的,样本行第一行表示id,第二行表示persona_model,第三行表示process_date 【参考方案1】:你可以这样做:
val newDF = oldDF.select(col("id"), col("persona_model")("Tech")("score").as("temp"))
然后您可以轻松提取 temp 值。
更新:如果您有多个 Key,则过程会稍微复杂一些。
首先为结构创建一个类(类型转换所必需的):
case class Score(score: Double, tag: String)
然后从数据中提取所有的键:
val keys = oldDF.rdd
.flatMap(r => r.getMap(1).asInstanceOf[Map[String, Score]].toList)
.collect.map(_._1).distinct.toList
最后你可以像这样提取所有的名字:
def condition(keys: List[String]): Column =
keys match
case k::ks => when(col("persona_model")(k)("score").isNotNull, col("persona_model")(k)("score")).otherwise(condition(ks))
case nil => lit(null)
val newDF = oldDF.select(col("id"), condition(keys))
【讨论】:
天哪,它奏效了,我爱你 illak,还有一件事,它创建了一个表格,但只为那些地图键为“Tech”而其他人为 null 的人显示分值,你能修复吗请:) 更新的答案,只有当地图只有一个元素(一对键值)时才有效以上是关于如何访问存储在scala spark中的数据框中的映射值和键的主要内容,如果未能解决你的问题,请参考以下文章
无法过滤存储在 spark 2.2.0 数据框中的 CSV 列
如何将字符串中带有双引号的json文件加载到spark scala中的数据框中