sparksql系列(七) Json转Map,多文件生成

公司所有产品均是json数据上报给数仓使用,由于格式的不统一造成数据处理很麻烦,经过讨论将公共字段抽取出来,将业务线自己的字段放在 extends字段里面各个业务线的人自己写sql解析extends字段处理。里面涉及到一个json转map的知识点再此记录一下。

一: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字段的作为区分),这次使用了这个,记录下来。其实本质是partitionBy

sparksql--->>>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)        }    }

原文地址:https://www.cnblogs.com/wuxiaolong4/p/12590473.html

时间: 2024-08-02 00:32:13

sparksql系列(七) Json转Map,多文件生成的相关文章

struts2官方 中文教程 系列七:消息资源文件

介绍 在本教程中,我们将探索使用Struts 2消息资源功能(也称为 resource bundles 资源绑定).消息资源提供了一种简单的方法,可以将文本放在一个视图页面中,通过应用程序,创建表单字段标签,并根据用户的语言环境将文本更改为特定的语言. 贴个本帖的地址,以免被爬:struts2官方 中文教程 系列七:消息资源文件  即 http://www.cnblogs.com/linghaoxinpian/p/6906720.html 下载本章节代码 信息资源属性文件 在Struts2 we

Exchange Server2013 系列七:客户端访问服务器高可用性部署实战

杜飞 在前面的文章中我们介绍了客户端访问服务器的高可用性技术,从这篇文章开始,我们就来看一个详细的高可用性部署方案. 首先,看一下我们的服务器列表: 编号 服务名 IP地址 功能 1 HYV01 IP:10.41.3.6 \16  网关:10.41.1.254 宿主机 2 HYV02 IP:10.41.4.6 \16  网关:10.41.1.254 宿主机 3 DF-DC01 IP:10.41.4.210\16 网关:10.41.1.254 DNS:10.41.4.210   10.41.4.2

Node.js 切近实战(七) 之Excel在线(文件&文件组)

最近西安的天气真他妈的热,感觉还是青海的天气美,最高温28度.上周逛了青海湖,感觉还是意犹未尽,其实我还是很喜欢去一趟西藏的,但是考虑到花费也没人陪我,我暂时放弃这个念头.计划去一下重庆或者甘南,也许是现实的. OK,废话不多说,今天我们来看一下Excel在线部分的文件和文件组.首先我们来看一下页面,调一下胃口.俗话说无图无真相,先看图. 没错,还是Telerik Kendo UI,其实我面试的时候当听到别人说自己用的是EasyUI和ExtJs的时候,我就不那么上心,但是如果有人用的是Kendo

C语言快速入门系列(七)

C语言快速入门系列(七) C语言指针进阶 本章引言: 在前面第5节中我们对C语言的指针进行了初步的学习理解;作为C语言的灵魂, C指针肯定没那么简单,在这一节中,我们将会对指针进行进一步的学习,比如二级指针, 指针数组,内存分配和const修饰指针常量等!下面就请大家跟随笔者的脚步,对 C指针神秘的一面进行进一步的解析吧! 本节学习路线图: 函数与指针: ①指针作为函数的形参: ②指向函数的指针: ③指针函数: ④带参数的主函数 ps:该代码的运行:先要编译生成exe文件后,来到exe所在文件目

Maven 系列 七 :Maven的生命周期和插件

一个完整的项目构建过程通常包括清理.编译.测试.打包.集成测试.验证.部署等步骤,Maven从中抽取了一套完善的.易扩展的生命周期.Maven的生命周期是抽象的,其中的具体任务都交由插件来完成.Maven为大多数构建任务编写并绑定了默认的插件,如针对编译的插件:maven-compiler-plugin.用户也可自行配置或编写插件. 1 . 三套生命周期 Maven定义了三套生命周期:clean.default.site,每个生命周期都包含了一些阶段(phase).三套生命周期相互独立,但各个生

【 D3.js 进阶系列 — 1.0 】 CSV 表格文件的读取

在入门系列的教程中,我们常用 d3.json() 函数来读取 json 格式的文件.json 格式很强大,但对于普通用户可能不太适合,普通用户更喜欢的是用 Microsoft Excel 或 OpenOffice Calc 等生成的表格文件,因为简单易懂,容易编辑.                       Microsoft Excel 通常会保存为 xls 格式, OpenOffice Calc 通常会保存为 ods 格式.这些格式作为表格文件来说都很强大,但要读取它们是有些麻烦的,D3

7.oracle学习门户系列七---网络管理和配置

oracle学习门户系列七 网络管理和配置 们学习了模式和用户.包含模式定义以及模式的作用. 这篇我么来看下ORACLE数据库中的网络管理和配置.只是这篇好像和上篇没有继承啊.这怎么看? Ok,事实上呢-..咳咳-..我们继续往下走 数据库的网络配置是比較基础可是也是很重要的.假设一个数据库连不上外部的世界:那么他就是一个孤立的资源,基本上就能够确认这是个无用的数据库系统. 我们在数据库定义中以前讲过,数据库是须要有多用户分享的,没有网络何来分享呢?对不正确.那肯定不是数据库了嘛. 前面摘要已经

5Python标准库系列之json模块

Python标准库系列之json模块 JSON (JavaScript Object Notation) http://json.org is a subset of JavaScript syntax (ECMA-262 3rd edition) used as a lightweight data interchange format. JSON通常用于在Web客户端和服务器数据交换,即把字符串类型的数据转换成Python基本数据类型或者将Python基本数据类型转换成字符串类型. 常用方法

elasticsearch系列七:ES Java客户端-Elasticsearch Java client(ES Client 简介、Java REST Client、Java Client、Spring Data Elasticsearch)

一.ES Client 简介 1. ES是一个服务,采用C/S结构 2. 回顾 ES的架构 3. ES支持的客户端连接方式 3.1 REST API ,端口 9200 这种连接方式对应于架构图中的RESTful style API这一层,这种客户端的连接方式是RESTful风格的,使用http的方式进行连接 3.2 Transport 连接 端口 9300 这种连接方式对应于架构图中的Transport这一层,这种客户端连接方式是直接连接ES的节点,使用TCP的方式进行连接 4. ES提供了多种