Spark解析JSON字符串

bash 复制代码
  {"zhang":{"pid":"alkjdlj","pname":"oweiwuio","page":"werwrw"}}

映射结构 : 第一层MAP,里面切套 MAP,key是String类型,value是string类型

bash 复制代码
val jsonMapper = MapType(StringType, MapType(StringType, StringType))

使用 schema_of_json 动态推断每个键的结构
s_desc 是传入的json格式的字段名称 , json_map是下文解析的变量值

bash 复制代码
    val dynamicResult = frame.withColumn("json_map", from_json(col("s_desc"), jsonMapper))
      // TODO:  person_key 是第一层嵌套的值,必须用这个名称才能取到,explode函数对json_map进行行转列
      .select(explode(col("json_map")).as(Seq("person_key", "person_data")))
      // TODO: 每一列里面进行取值
      .select(
        col("person_key"),
        col("person_data").getItem("pid").as("pid"),
        col("person_data").getItem("pname").as("pname"),
        col("person_data").getItem("page").as("page")
      )
bash 复制代码
package com.zxl

import org.apache.spark.SparkConf
import org.apache.spark.sql.SparkSession
import org.apache.spark.sql.catalyst.dsl.expressions.{DslExpression, StringToAttributeConversionHelper}
import org.apache.spark.sql.functions.{col, explode, from_json, get_json_object, posexplode}
import org.apache.spark.sql.types.{IntegerType, MapType, StringType, StructField, StructType}

import java.util.Properties

object JSONTest {
  def main(args: Array[String]): Unit = {
    // TODO: 创建上下文
    val sparkName = new SparkConf().setMaster("local[*]").setAppName("sparkName")
    // TODO: 创建sparkSession
    val session = SparkSession.builder().config(sparkName).getOrCreate()
    // TODO: 配置JDBC配置,连接mysql
    val props: Properties = new Properties()
    props.setProperty("user", "root")
    props.setProperty("password", "1234")
    // TODO: 配置 school 表连接
    val school = session.read.jdbc("jdbc:mysql://localhost:3306/world", "school", props)
    // TODO: 注册视图表 school
    school.createOrReplaceTempView("school")
    val frame = session.sql("select * from school")

    // TODO:  {"zhang":{"pid":"alkjdlj","pname":"oweiwuio","page":"werwrw"}}
    // TODO: 映射结构 : 第一层MAP,里面切套 MAP,key是String类型,value是string类型
    val jsonMapper = MapType(StringType, MapType(StringType, StringType))
    // TODO:   使用 schema_of_json 动态推断每个键的结构
    // TODO:  s_desc 是传入的json格式的字段名称 , json_map是下文解析的变量值
    val dynamicResult = frame.withColumn("json_map", from_json(col("s_desc"), jsonMapper))
      // TODO:  person_key 是第一层嵌套的值,必须用这个名称才能取到,explode函数对json_map进行行转列
      .select(explode(col("json_map")).as(Seq("person_key", "person_data")))
      // TODO: 每一列里面进行取值
      .select(
        col("person_key"),
        col("person_data").getItem("pid").as("pid"),
        col("person_data").getItem("pname").as("pname"),
        col("person_data").getItem("page").as("page")
      )

    dynamicResult.createOrReplaceTempView("zhangMs")


    // TODO: 配置 person 表连接
    val person = session.read.jdbc("jdbc:mysql://localhost:3306/world", "person", props)
    // TODO: 注册视图表 person
    person.createOrReplaceTempView("person")
    session.sql("select * from zhangMs Left join person on zhangMs.person_key=person.pid").show()



    session.stop()
    session.close()
  }
}
相关推荐
武子康14 小时前
大数据-237 离线数仓 - Hive 广告业务实战:ODS→DWD 事件解析、广告明细与转化分析落地
大数据·后端·apache hive
大大大大晴天16 小时前
Flink生产问题排障-Kryo serializer scala extensions are not available
大数据·flink
武子康3 天前
大数据-236 离线数仓 - 会员指标验证、DataX 导出与广告业务 ODS/DWD/ADS 全流程
大数据·后端·apache hive
肌肉娃子3 天前
20260227.spark.Spark 性能刺客:千万别在 for 循环里写 withColumn
spark
武子康4 天前
大数据-235 离线数仓 - 实战:Flume+HDFS+Hive 搭建 ODS/DWD/DWS/ADS 会员分析链路
大数据·后端·apache hive
DianSan_ERP4 天前
电商API接口全链路监控:构建坚不可摧的线上运维防线
大数据·运维·网络·人工智能·git·servlet
够快云库4 天前
能源行业非结构化数据治理实战:从数据沼泽到智能资产
大数据·人工智能·机器学习·企业文件安全
AI周红伟4 天前
周红伟:智能体全栈构建实操:OpenClaw部署+Agent Skills+Seedance+RAG从入门到实战
大数据·人工智能·大模型·智能体
B站计算机毕业设计超人4 天前
计算机毕业设计Django+Vue.js高考推荐系统 高考可视化 大数据毕业设计(源码+LW文档+PPT+详细讲解)
大数据·vue.js·hadoop·django·毕业设计·课程设计·推荐算法
计算机程序猿学长4 天前
大数据毕业设计-基于django的音乐网站数据分析管理系统的设计与实现(源码+LW+部署文档+全bao+远程调试+代码讲解等)
大数据·django·课程设计