spark中读取json_Spark解析Json数据(非Sql方式)

import play.api.libs.json._

val input = sc.parallelize(List( """{"name":"过往记忆","website":"www.iteblog.com"}""",

"""{"other":"过往记忆"}"""))

val parsed = input.map(Json.parse)

parsed.collect

output:

{"name":"过往记忆","website":"www.iteblog.com"}

{"other":"过往记忆"}

这样很就解析出Json了,但是我们只是简单将它转换成字符串了,相当于还是没解析。上面的Json数据每条Json格式不一样,如果你的Json数据格式都一样,比如每条Json最多只包含了name和website属性,那么可以这样解析: import play.api.libs.json._

val input = sc.parallelize(List( """{"name":"过往记忆","website":"www.iteblog.com"}""",

"""{"name":"过往记忆"}"""))

val parsed = input.map(Json.parse)

case class Info(name: String, website: String) {

override def toString: String = name + "\t" + website

}

implicit val personReads = Json.format[Info]

val result = parsed.flatMap(record => personReads.reads(record).asOpt)

result.collect

output:

过往记忆www.iteblog.com

也就是把Json数据解析出来了,并存储在Info类型中,这样就便于下面我们的处理。细心的同学可能会说,这个Json不是有两条数据吗?{"name":"过往记忆"}这条数据为什么没打出了?这是因为,我们不能保证输入的Json数据格式都是包含了name和website属性,如果不包含这两个属性的Json数据我们认为其是错误的数据,也就是要过滤掉。我们在程序中使用到asOpt和flatMap,它的功能是当解析失败的时候将那条失败的数据过滤掉。

如果我们需要将计算的结果保存成Json的数据可以如下操作: val data = sc.parallelize(List(Info("过往记忆", "www.iteblog.com")))

data.map(Json.toJson(_)).collect.foreach(println)

结果是{"name":"过往记忆","website":"www.iteblog.com"}。

需要正常运行上面的程序,需要引入相关的依赖包:如果你是用Maven,请在你的pom.xml文件加入以下依赖:

com.typesafe.play

play-json_2.10

2.4.0-M1

如果你是用sbt,请在build.sbt文件加入以下依赖: "com.typesafe.play" % "play-json_2.10" % "2.2.1"

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值