sparksql系列(七) Json转Map,多文件生成
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了sparksql系列(七) Json转Map,多文件生成,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含4531字,纯文字阅读大概需要7分钟。
内容图文
![sparksql系列(七) Json转Map,多文件生成](/upload/InfoBanner/zyjiaocheng/521/b9f9e79286c741d09462b1ba884809b7.jpg)
一:JSON转Map
为什需要将JSON转Map
公司里面产品很多,上报的数据很多,格式极其不规范同名的事情是常有的,对于解析来说是非常困难的,需要统一的脚本把字段解析出来。
上报的数据类似:{"id":"7","sex":"7","data":{"sex":"13","class":"7"}}
jar包导入
我们使用fastjson来将json处理成Map的数据结构
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.47</version>
</dependency>
数据
{"id":"7","sex":"7","da","data":{"name":"7","class":"7","data":{"name":"7","class":"7"}}}
{"id":"8","name":"8","data":{"sex":"8","class":"8"},"data":{"sex":"8","class":"8"}}
{"class":"9","data":{"name":"9","sex":"9"}}
{"id":"10","name":"10","data":{"sex":"10","class":"10"}}
{"id":"11","class":"11","data":{"name":"11","sex":"11"}}
代码
import org.apache.spark.sql.SparkSession
import com.alibaba.fastjson.JSON
import java.util
//我们把例子中的id单独提取出来,将其余字段保留到extends里面
val sparkSession= SparkSession.builder().master("local").getOrCreate()
val nameRDD1df = sparkSession.read.textFile("/software/java/idea/data")
import sparkSession.implicits._
import org.apache.spark.sql.functions.col
val finalResult = nameRDD1df.map(x=>{
var map:util.HashMap[String, Object] = new util.HashMap[String, Object]()
try{
map = JSON.parseObject(x, classOf[util.HashMap[String, Object]])
}catch {case e :Exception =>{ println(e.printStackTrace())}}
var finalMap:util.HashMap[String, Object] = if(map.containsKey("data")){
var dataMap:util.HashMap[String, Object] = new util.HashMap[String, Object]()
try{
dataMap = JSON.parseObject(map.get("data").toString, classOf[util.HashMap[String, Object]])
}catch {case e :Exception =>{ println(e.printStackTrace())}}
dataMap.putAll(map);dataMap.remove("id");dataMap.remove("data");
dataMap
}else {new util.HashMap[String, Object]()}
val id = if(map.get("id") == null) "" else map.get("id").toString
(id,JSON.toJSONString(finalMap,false))
})
.toDF("id","extends")
.filter(col("id") =!= "")
finalResult.show(10,false)
二:多文件生成
很多时候我们使用sparksql,就是读取一个目录生成一个目录,但是真正使用的时候,会有读取多个目录生成多个目录的需求(数据里面有ID字段的作为区分),这次使用了这个,记录下来。其实本质是partitionBysparksql--->>>partitionBy
import org.apache.spark.sql.SparkSession
val sparkSession= SparkSession.builder().master("local").getOrCreate()
val nameRDD1df = sparkSession.read.json("/software/java/idea/data")
.select("id","name")
.write.mode(SaveMode.Append).partitionBy("id")
.json("/software/java/idea/end")
spark-core--->>>自定义函数
import org.apache.spark.sql.SparkSession
import org.apache.hadoop.fs.{FileSystem, Path}
val sparkSession= SparkSession.builder().master("local").getOrCreate()
val sparkContext = sparkSession.sparkContext
val fileSystem = FileSystem.get(sparkContext.hadoopConfiguration)
fileSystem.delete(new Path("/software/java/idea/end"), true)
sparkContext.textFile("/software/java/idea/data").map(x=>{
val array = x.split("\\|")
((array(0)+"="+array(1)),array(2))
}).saveAsHadoopFile("/software/java/idea/end",classOf[String],classOf[String],classOf[RDDMultipleTextOutputFormat[_, _]])
import org.apache.hadoop.mapred.lib.MultipleTextOutputFormat
class RDDMultipleTextOutputFormat[K, V]() extends MultipleTextOutputFormat[K, V]() {
override def generateFileNameForKeyValue(key: K, value: V, name: String) : String = {
(key + "/" + name)
}
}
sparksql系列(七) Json转Map,多文件生成
标签:ott 数据 提取 ado color RKE spl implicit saveas
本文系统来源:https://www.cnblogs.com/wuxiaolong4/p/12590473.html
内容总结
以上是互联网集市为您收集整理的sparksql系列(七) Json转Map,多文件生成全部内容,希望文章能够帮你解决sparksql系列(七) Json转Map,多文件生成所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。