生产环境_从数据到层级结构JSON:使用Spark构建多层次树形数据_父子关系生成

代码补充了!兄弟萌

造的样例数据

val data = Seq(
  ("USA", "Male", "Asian", "Chinese"),
  ("USA", "Female", "Asian", "Chinese"),
  ("USA", "Male", "Black", "African"),
  ("USA", "Female", "Black", "African"),
  ("USA", "Male", "White", "European"),
  ("USA", "Female", "White", "European"),
  ("Europe", "Male", "Asian", "Chinese"),
  ("Europe", "Female", "Asian", "Chinese"),
  ("Europe", "Male", "Black", "African"),
  ("Europe", "Female", "Black", "African"),
  ("Europe", "Male", "White", "European"),
  ("Europe", "Female", "White", "European")
)

代码核心逻辑

import org.apache.hadoop.io.serializer.Serialization
import org.apache.spark.{SparkConf, SparkContext}
import org.apache.spark.sql.types.{StringType, StructField, StructType}

import org.apache.spark.sql.{Dataset, Row, SparkSession}
import org.json4s.NoTypeHints
import org.json4s.DefaultFormats
import org.json4s.jackson.Serialization.writePretty
 定义Node类
//case class Node(title: String, key: String, children: Seq[Node])
/*作者:Matrix70
博客地址:https://blog.csdn.net/qq_52128187?type=blog
时间:20231205*/
object Parent_child_v7_xuqiu {
  def main(args: Array[String]): Unit = {

    val conf = new SparkConf().setAppName("Parent_child_v3").setMaster("local[1]")
    val sc = new SparkContext(conf)
    val spark = SparkSession.builder.appName("Parent_child_v3").getOrCreate()

    import spark.implicits._

    val df1 = sc.textFile("C:\\zzcode\\workplace\\src\\main\\data\\country")

    val schema = StructType(
      Array(
        StructField("Country", StringType, nullable = true),
        StructField("Gender", StringType, nullable = true),
        StructField("Ethnicity", StringType, nullable = true),
        StructField("Race", StringType, nullable = true)
      )
    )

    val rowRDD = df1.map(line => {
      val parts = line.split(",")
      Row(parts(0), parts(1), parts(2), parts(3))
    })

    val df = spark.createDataFrame(rowRDD, schema)

    df.show()
    // 构建节点层级结构并转换为JSON格式
    def toHierarchy(df: Dataset[Row]): String = {
      def buildHierarchy(country: String): Node = {
        val uniqueGenders = df.filter($"Country" === country).select("Gender").distinct().as[String].collect()
        val genderNodes = uniqueGenders.map { gender =>
          val filteredRows = df.filter($"Country" === country && $"Gender" === gender)
          val ethnicityNodes = filteredRows.select("Ethnicity").distinct().as[String].collect().map { ethnicity =>
            val children = filteredRows.filter($"Ethnicity" === ethnicity).select("Race").as[String].collect().map(race => Node(race, s"$country-$gender-$ethnicity-$race", Seq.empty))
            Node(ethnicity, s"$country-$gender-$ethnicity", children)
          }
          Node(gender, s"$country-$gender", ethnicityNodes)
        }
        Node(country, country, genderNodes)
      }

      val uniqueCountries = df.select("Country").distinct().as[String].collect()
      val roots = uniqueCountries.map(buildHierarchy)

      implicit val formats: DefaultFormats.type = DefaultFormats
      writePretty(roots)
    }

    // 调用toHierarchy并打印结果
    val resultJSON = toHierarchy(df)
    println(resultJSON)

    spark.stop()
  }
}

提供给前端的html树结构样例

代码生成结果提供给前端的格式

[
  {
    "title": "USA",
    "key": "USA",
    "children": [
      {
        "title": "Male",
        "key": "USA-Male",
        "children": [
          {
            "title": "Asian",
            "key": "USA-Male-Asian",
            "children": [
              {
                "title": "Chinese",
                "key": "USA-Male-Asian-Chinese",
                "children": []
              }
            ]
          },
          {
            "title": "Black",
            "key": "USA-Male-Black",
            "children": [
              {
                "title": "African",
                "key": "USA-Male-Black-African",
                "children": []
              }
            ]
          },
          {
            "title": "White",
            "key": "USA-Male-White",
            "children": [
              {
                "title": "European",
                "key": "USA-Male-White-European",
                "children": []
              }
            ]
          }
        ]
      },
      {
        "title": "Female",
        "key": "USA-Female",
        "children": [
          {
            "title": "Asian",
            "key": "USA-Female-Asian",
            "children": [
              {
                "title": "Chinese",
                "key": "USA-Female-Asian-Chinese",
                "children": []
              }
            ]
          },
          {
            "title": "Black",
            "key": "USA-Female-Black",
            "children": [
              {
                "title": "African",
                "key": "USA-Female-Black-African",
                "children": []
              }
            ]
          },
          {
            "title": "White",
            "key": "USA-Female-White",
            "children": [
              {
                "title": "European",
                "key": "USA-Female-White-European",
                "children": []
              }
            ]
          }
        ]
      }
    ]
  },
  {
    "title": "Europe",
    "key": "Europe",
    "children": [
      {
        "title": "Male",
        "key": "Europe-Male",
        "children": [
          {
            "title": "Asian",
            "key": "Europe-Male-Asian",
            "children": [
              {
                "title": "Chinese",
                "key": "Europe-Male-Asian-Chinese",
                "children": []
              }
            ]
          },
          {
            "title": "Black",
            "key": "Europe-Male-Black",
            "children": [
              {
                "title": "African",
                "key": "Europe-Male-Black-African",
                "children": []
              }
            ]
          },
          {
            "title": "White",
            "key": "Europe-Male-White",
            "children": [
              {
                "title": "European",
                "key": "Europe-Male-White-European",
                "children": []
              }
            ]
          }
        ]
      },
      {
        "title": "Female",
        "key": "Europe-Female",
        "children": [
          {
            "title": "Asian",
            "key": "Europe-Female-Asian",
            "children": [
              {
                "title": "Chinese",
                "key": "Europe-Female-Asian-Chinese",
                "children": []
              }
            ]
          },
          {
            "title": "Black",
            "key": "Europe-Female-Black",
            "children": [
              {
                "title": "African",
                "key": "Europe-Female-Black-African",
                "children": []
              }
            ]
          },
          {
            "title": "White",
            "key": "Europe-Female-White",
            "children": [
              {
                "title": "European",
                "key": "Europe-Female-White-European",
                "children": []
              }
            ]
          }
        ]
      }
    ]
  }
]
//https://blog.csdn.net/qq_52128187?type=blog

补充html文件

json生成前端界面展示代码,可以保存在本地文件,命名为html即可在浏览器打开查看,就是我上面的层级结构的样子了。

<!DOCTYPE html>
<html>
<head>
  <title>JSON to Tree Example</title>
  <script src="https://d3js.org/d3.v6.min.js"></script>
  <style>
    .node circle {
      fill: #fff;
      stroke: steelblue;
      stroke-width: 1.5px;
    }

    .node text {
      font-size: 12px;
    }
  </style>
</head>
<body>
  <div id="tree-container"></div>

<script>
// JSON字符串
const jsonStr = `{
  "title": "USA",
  "key": "USA",
  "children": [
    {
      "title": "Asian",
      "key": "USA-Asian",
      "children": [
        {
          "title": "Chinese",
          "key": "USA-Asian-Chinese",
          "children": [
            {
              "title": "Beijing",
              "key": "USA-Asian-Chinese-Beijing",
              "children": []
            }
          ]
        }
      ]
    },
    {
      "title": "Black",
      "key": "USA-Black",
      "children": [
        {
          "title": "African",
          "key": "USA-Black-African",
          "children": [
            {
              "title": "Nigeria",
              "key": "USA-Black-African-Nigeria",
              "children": []
            }
          ]
        }
      ]
    },
    {
      "title": "White",
      "key": "USA-White",
      "children": [
        {
          "title": "European",
          "key": "USA-White-European",
          "children": [
            {
              "title": "Italy",
              "key": "USA-White-European-Italy",
              "children": []
            }
          ]
        }
      ]
    }
  ]
}`;

// 解析JSON字符串为树状结构
const data = JSON.parse(jsonStr);

// 创建绘图容器
const svg = d3.select("#tree-container")
  .append("svg")
  .attr("width", 500)
  .attr("height", 500);

// 创建树布局
const treeLayout = d3.tree().size([400, 400]);

// 将数据转换为层级关系
const root = d3.hierarchy(data);

// 计算节点的位置
treeLayout(root);

// 绘制节点和链接
const nodes = root.descendants();
const links = root.links();

const nodeGroup = svg.selectAll(".node")
  .data(nodes)
  .enter()
  .append("g")
  .attr("transform", d => `translate(${d.y}, ${d.x})`);

nodeGroup.append("circle")
  .attr("r", 5)
  .style("fill", "#fff")
  .style("stroke", "steelblue")
  .style("stroke-width", "1.5px");

nodeGroup.append("text")
  .attr("x", 13)
  .attr("y", 4)
  .style("font-size", "12px")
  .text(d => d.data.title);

svg.selectAll(".link")
  .data(links)
  .enter()
  .append("path")
  .attr("class", "link")
  .attr("d", d => {
    return `M${d.source.y},${d.source.x}L${d.target.y},${d.target.x}`;
  })
  .style("fill", "none")
  .style("stroke", "#ccc")
  .style("stroke-width", "1px");
</script>
</body>
</html>

其实我要的结果就是能匹配上数据格式,如下图。前端的同事他们渲染后,基本就是这个样子

参考文章获连接:

Ant Design Vue — An enterprise-class UI components based on Ant Design and Vue.js,这个网页是树形控件的结构,给我提供一个基本构建思路吧

ok!!!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/221816.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

网络之路26:STP生成树协议

正文共&#xff1a;2222 字 19 图&#xff0c;预估阅读时间&#xff1a;3 分钟 目录 网络之路第一章&#xff1a;Windows系统中的网络 0、序言 1、Windows系统中的网络1.1、桌面中的网卡1.2、命令行中的网卡1.3、路由表1.4、家用路由器 网络之路第二章&#xff1a;认识企业设备…

碳信用市场的未来:中碳CCNG的愿景

在全球碳减排努力日益增强的背景下&#xff0c;中国碳中和发展集团有限公司&#xff08;简称中碳CCNG&#xff09;正以其创新的碳交易平台引领行业新趋势。中碳CCNG提供的一站式综合服务不仅包括碳信用的托管、买卖和抵消&#xff0c;而且通过其综合性数字平台&#xff0c;促进…

【100天精通Python】Day75:Python机器学习-第一个机器学习小项目_鸾尾花分类项目(上)

目录 1 机器学习中的Helloworld _鸾尾花分类项目 2 导入项目所需类库和鸾尾花数据集 2.1 导入类库 2.2 scikit-learn 库介绍 &#xff08;1&#xff09;主要特点&#xff1a; &#xff08;2&#xff09;常见的子模块&#xff1a; 3 导入鸾尾花数据集 3.1 概述数据 3.…

matlab 最小二乘拟合空间直线(方法二)

目录 一、算法原理1、算法过程2、参考文献二、代码实现三、结果展示四、相关链接本文由CSDN点云侠原创,原文链接。如果你不是在点云侠的博客中看到该文章,那么此处便是不要脸的爬虫与GPT。 一、算法原理

IT外包服务内容有哪些?

在信息技术迅猛发展的今天&#xff0c;越来越多的企业为了提高效率、降低成本以及更专注于核心业务&#xff0c;选择将信息技术工作外包给专业的IT服务公司。IT外包包含很多不同的服务&#xff0c;以下是对主要服务内容的简要概述。 1. 网络建设与维护 网络是现代企业信息系统…

jquery实现省市区三级联动

一、技术&#xff1a; 前端采用的是jsp页面 后端采用springmvcmybatismysql8 效果图 二、cascadeSelect.jsp页面 <% page contentType"text/html;charsetUTF-8" language"java" %> <%String path request.getContextPath();String basePath …

每日一练2023.12.5—— 一帮一【PTA】

题目链接&#xff1a; L1-030 一帮一 题目要求&#xff1a; “一帮一学习小组”是中小学中常见的学习组织方式&#xff0c;老师把学习成绩靠前的学生跟学习成绩靠后的学生排在一组。本题就请你编写程序帮助老师自动完成这个分配工作&#xff0c;即在得到全班学生的排名后&…

西安安泰——ATA-1220E宽带放大器

ATA-1220E宽带放大器简介 ATA-1220E是一款可放大交直流信号的差分通道宽带放大器。其最大输出电压 60Vp-p(30Vp)&#xff0c;最大输出电流1Ap&#xff08;>50Hz&#xff09;。电压增益数控可调&#xff0c;一键保存设置&#xff0c;提供了方便简洁的操作选择&#xff0c;可…

华为无线配置模板 一

华为无线配置模板 一 拓扑图1.配置SwitchA和AC&#xff0c;使AP与AC之间能够传输CAPWAP报文2.配置AC作为DHCP服务器&#xff0c;为STA和AP分配IP地址3.配置AP上线4.配置WLAN业务参数5.验证配置结果 拓扑图 采用如下的思路配置小型网络的WLAN基本业务&#xff1a;1.配置AP、AC、…

阿里云账号注册完成实名认证免费领取云服务器4台

注册阿里云&#xff0c;免费领云服务器&#xff0c;每月280元额度&#xff0c;3个月试用时长&#xff0c;可快速搭建网站/小程序&#xff0c;部署开发环境&#xff0c;开发多种企业应用&#xff0c;共3步骤即可免费领取阿里云服务器&#xff0c;阿里云服务器网aliyunfuwuqi.com…

一键抠图1:Python实现人像抠图 (Portrait Matting)

一键抠图1&#xff1a;Python实现人像抠图 (Portrait Matting) 目录 一键抠图1&#xff1a;Python实现人像抠图 (Portrait Matting) 1. 项目介绍 2. 抠图算法 3. Matting数据集 4. MODNet模型 (1) 项目安装 (2) 数据集说明 (3) MODNet模型 5. Demo测试效果 6. 源码下载…

Windows循环检测,直到网络通/断后执行指定命令

前言 前几天&#xff0c;一个朋友让我帮他做个脚本或者批处理&#xff0c;要实现的功能很简单&#xff1a;开机时检测网络是否联通&#xff0c;如果联通了就执行一个指定的程序&#xff0c;然后脚本就可以退出了。 批处理的解决方法 手动操作时&#xff0c;我们通常使用ping…

(2)(2.4) TerraRanger Tower/Tower EVO(360度)

文章目录 前言 1 安装传感器并连接 2 通过地面站进行配置 3 参数说明 前言 TeraRanger Tower 可用于在 Loiter 和 AltHold 模式下进行目标规避。传感器的最大可用距离约为 4.5m。 TeraRanger Tower EVO 可用于在 Loiter 和 AltHold 模式下进行目标规避。传感器的最大可用…

电子编曲软件FL Studio2024汉化中文免费版下载

电子编曲需要什么软件&#xff1f;市面上的宿主软件都可以完成电子编曲的工作&#xff0c;主要适用电子音乐风格编曲的宿主软件有FL Studio、Ableton Live等。电子编曲需要什么基础&#xff1f;需要对于电子音乐足够熟悉、掌握基础乐理知识以及宿主软件的使用方法。 就我个人的…

TinyMPC - CMU (卡耐基梅隆大学)开源的机器人 MPC 控制器

系列文章目录 CasADi - 最优控制开源 Python/MATLAB 库 文章目录 系列文章目录前言一、机器人硬件对比1.1 Teensy 上的微控制器基准测试1.2 机器人硬件1.3 BibTeX 二、求解器三、功能&#xff08;预期&#xff09;3.1 高效3.2 鲁棒3.3 可嵌入式3.4 最小依赖性3.5 高效热启动3.…

Geoserver发布2000坐标系遇到的问题总结

在Geoserver上发布2000坐标系的服务时&#xff0c;要想正常发布服务&#xff0c;不仅仅是要涉及2000坐标系&#xff0c;还需要在发布的时候选择对坐标系。具体问题描述如下&#xff1a; 1.问题描述&#xff1a; 在发布好2000坐标系的服务后&#xff0c;在超图的平台加载服务时&…

回溯算法:复原IP地址 子集 子集II

93.复原IP地址 思路&#xff1a; 与分割回文串相似&#xff0c;复原ip地址是将给定字符串分割成点分十进制的四段&#xff0c;切割问题就可以使用回溯搜索法把所有可能性搜出来。回溯三部曲&#xff1a; 递归参数&#xff1a;除了传入的需要分割的字符串&#xff0c;仍然需要…

每天五分钟计算机视觉:VGG网络相对于AlexNet网络有哪些不同?

本文重点 在前面的课程中&#xff0c;我们已经学习了VGG网络模型&#xff0c;也学习了AlexNet网络模型&#xff0c;AlexNet模型先于VGG网络模型产生&#xff0c;所以VGG在一定程度上要优于AlexNet模型&#xff0c;二者来看一下&#xff0c;二者究竟有什么不同&#xff1f; 深度…

数据湖和中央数据仓库的设计

设计数据湖或中央数据仓库是许多大型组织的主要职能&#xff0c;这些组织每天处理数百万笔交易&#xff0c;并对这些交易进行进一步的报告、预测或机器学习项目分析。 为了将所有来自源系统&#xff08;我们称之为“上游”&#xff09;到其他业务应用&#xff08;所谓“下游”&…

基于ssm vue技术的品牌银饰售卖平台源码和论文737

摘 要 本论文主要是针对品牌银饰售卖而开发进行概述&#xff0c;主要包括对研究的背景和研究现状&#xff0c;以及研究目的等的阐述&#xff0c;也对该系统的各种功能要求&#xff0c;对系统结构&#xff0c;数据库的设计等进行讨论。随着科技与技术的发展&#xff0c;利用计…