Scala中将List[Seq[String]]转为Map时的单键多值问题排查
问题分析与解决方案
你现在的问题核心是创建Map的逻辑搞反了遍历层级:
当前代码里,你是对整个resultsList执行map操作,把所有子列表的第0个元素收集成一个序列作为group_name的值,第1个元素收集成序列作为event_name的值……这就导致每个Map键对应一整列数据,自然会出现一个键绑定多个值的错误输出。
而我们需要的是遍历resultsList中的每一条子记录(每个Seq[String]),为每条记录单独生成一个包含所有字段的Map,这样每个Map就对应一条符合你期望的键值对记录。
修正后的代码
// 遍历每条子记录,为每条记录单独创建Map val individualRecords = resultsList.map { sublist => Map( "group_name" -> sublist(0), "event_name" -> sublist(1), "venue_name" -> sublist(2), "distance" -> sublist(3) ) }
这样处理后,individualRecords的类型是List[Map[String, String]],其中每个Map元素就是一条独立的记录,格式完全符合你的期望:
event_name:"Sketch-Up at Field Museum (DRY MEDIA ONLY)" venue_name:"The Field Museum" distance:3116.147997575436
额外建议:适配Spark写入Kibana的最佳实践
如果要把这些数据写入Kibana,推荐将这个List转换成Spark DataFrame,因为Spark与Elasticsearch(Kibana依赖的存储)的集成对DataFrame支持更友好:
import spark.implicits._ // 将List[Map]转换为DataFrame val eventsDF = individualRecords.toDF() // 写入Elasticsearch(Kibana可直接读取该索引) eventsDF.write.format("org.elasticsearch.spark.sql") .option("es.nodes", "你的ES节点地址") .option("es.port", "9200") .option("es.index.auto.create", "true") // 自动创建索引 .save("events_index/_doc") // 替换为你想使用的索引名
这样写入后,Kibana里就能看到每条独立的事件记录了。
内容的提问来源于stack exchange,提问作者Cassie
相关产品推荐
相关产品推荐

