json - 将 Spark JSON 格式的 RDD 值解析为不同的值
问题描述
我正在尝试在 Spark (Scala) 中对具有 N 个值且一个为 JSON 格式的 RDD 执行某种 flatMap。
例如,当我打印 RDD 时,我有类似的东西:
myRDD.collect().foreach(println)
[2020,{'COL_A': 1064.3667, 'col_B': 14534.2}]
[2020,{'COL_A': 1064.3667, 'col_B': 145.2}]
[2020,{'COL_A': 1064.3667, 'col_B': 15576.2}]
我想要这样的东西:
[2020,1064.3667,14534.2]
[2020,1064.3667,145.2]
[2020,1064.3667,15576.2]
我不知道这是否可以用平面图完成......
谢谢!
解决方案
使用内置json4s
库解析 json。
导入所需的库
scala> import org.json4s.jackson.JsonMethods._
import org.json4s.jackson.JsonMethods._
scala> import org.json4s._
import org.json4s._
scala> val rdd = spark
.sparkContext
.parallelize(
Seq(
(2020,"""{"COL_A": 1064.3667, "col_B": 14534.2}"""),
(2020,"""{"COL_A": 1064.3667, "col_B": 145.2}"""),
(2020,"""{"COL_A": 1064.3667, "col_B": 15576.2}""")
)
)
scala> rdd.collect.foreach(println)
(2020,{"COL_A": 1064.3667, "col_B": 14534.2})
(2020,{"COL_A": 1064.3667, "col_B": 145.2})
(2020,{"COL_A": 1064.3667, "col_B": 15576.2})
scala> :paste
// Entering paste mode (ctrl-D to finish)
val transformedRdd = rdd.map { c =>
implicit val formats = DefaultFormats
val values = parse(c._2).extract[Map[String,Double]].values.toList
(c._1,values.head,values.last)
}
// Exiting paste mode, now interpreting.
scala> transformedRdd.collect.foreach(println)
(2020,1064.3667,14534.2)
(2020,1064.3667,145.2)
(2020,1064.3667,15576.2)
推荐阅读
- angular - 在 Angular 6 中模拟 Jasmine 测试的路由器订阅
- javascript - 尝试返回矩阵中的列,但使用正确的控制台输出未定义方法
- node.js - 如何在 expressJS 服务器中从客户端提供 index.html 静态文件?
- azure-cognitive-search - 从 azure search 获取传播结果
- java - 无法提取响应:单元测试中没有合适的 HttpMessageConverter 错误
- wordpress - Gutenberg MediaUpload 在编辑器中消失
- azure - 将 IdentityServer4 快速入门部署到 Azure Web 应用程序在索引页面上返回 404,但其他路由有效
- angular - 如何在 OpenTok 屏幕共享订阅者中检测 publishVideo(false)
- python - 分组pytest标记
- ubuntu - 无法在 ubuntu18.04 64 位机器上安装 anaconda 5.3.1 Anaconda3-5.3.1-Linux-x86_64.sh