Spark通过mapPartitions方式加载Json文件,提高文件加载速度

介绍了使用Spark从HDFS加载JSON文件并将其转换为JSON对象的方法。通过优化,将每秒读取速度从1M提升到100M以上,详细说明了采用mapPartitions方法减少JSON解析器创建次数的技术细节。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

这几天遇到了需要从hdfs加载json字符串,然后转化成json对象的场景。刚开始的实现方式见如下代码:

[java]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. val loginLogRDD = sc.objectFile[String](loginFile, loadLoginFilePartitionNum)  
  2.      .filter(jsonString => {  
  3.      //val loginItem = line.toString().split("\t")  
  4.      //LoginRecord(loginItem(0).toInt, loginItem(1), loginItem(2), loginItem(3).toInt, loginItem(4), loginItem(5), loginItem(6), loginItem(7).toInt, loginItem(8), loginItem(9), loginItem(10), loginItem(11), loginItem(12))  
  5.      val json = JSON.parseFull(jsonString)  
  6.      val resultJson = json match {  
  7.        case Some(map: Map[String, Any])  => if (map.get("ip").getOrElse("").equals("")) false else true  
  8.        case None => false  
  9.      }  
  10.      resultJson  
  11.      }).  

从以上代码可知,每条Json记录,都会创建Json解析器来进行解析。

这种方式加载速度特别慢,1s大概才1M左右,并且CPU也特别忙。因此推测是Spark程序有问题导致的。

为了提高记载速度,决定采用mapPartitions方式加载Json串,也就是每个分区只创建一个Json解析器,代码如下:

[java]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. val loginLogRDD = sc.objectFile[String](loginFile, loadLoginFilePartitionNum)  
  2.       .mapPartitions(jsonStringIter=>{  
  3.       val mapper = new ObjectMapper()  
  4.       mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false)  
  5.       mapper.registerModule(DefaultScalaModule)  
  6.       jsonStringIter.map(record => {  
  7.         try {  
  8.           Some(mapper.readValue(record, classOf[JsonLoginRecord]))  
  9.         } catch {  
  10.           case e: Exception => None  
  11.         }  
  12.   
  13.       })  
  14.     })  

修改之后,每秒加载速度达到了100多兆,速度提高了100多倍,效果截图如下:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值