当前位置: 首页 > news >正文

使用spark进行递归的可行方案

在实际工作中会遇到,最近有需求将产品炸开bom到底层,但是ERP中bom数据在一张表中递归存储的,不循环展开,是无法知道最底层原材料是什么。

        在ERP中使用pl/sql甚至sql是可以进行炸BOM的,但是怎么使用spark展开,并且效率要不Oracle更高效的展开,是个问题。

展开方法

        有以下步骤:

                1. 使用spark sql中sql直接递归展开:

                        优点:可行,且效率很快

                        缺点:一个sql炸到底层,无法添加在炸开过程中的逻辑管控

                2. 一层层的展开BOM,直到没有可以展开的物料为止

                        实际效果:

                                优点:可行,并可以在每一层进行管快

                                优缺点:本质上,并不是递归计算,而是过度有限循环的计算

                                               与一些需求有冲突,比如原需求为递归计算,按照需求扣减现有量,是无法实现的

                3. 使用spark(scala)递归炸开bom:--实验中

具体步骤如下

1.使用spark sql展开bom

在Scala中,我们可以使用Spark SQL来执行递归查询。要使用Spark SQL进行递归查询,我们首先需要创建一个递归查询视图,然后在该视图中执行我们的查询操作。接下来,我们将介绍一个具体的示例来解释如何使用Spark SQL进行递归查询。

假设我们有一个部门表,其中包含部门的ID和上级部门的ID。我们想要查询一个部门的所有上级部门直到根部门的层级关系。以下是一个简化的部门表结构和数据:

CREATE TABLE department (department_id INT,parent_department_id INT
);INSERT INTO department VALUES (1, NULL);
INSERT INTO department VALUES (2, 1);
INSERT INTO department VALUES (3, 2);
INSERT INTO department VALUES (4, 3);
INSERT INTO department VALUES (5, 3);
INSERT INTO department VALUES (6, NULL);
INSERT INTO department VALUES (7, 6);

我们可以使用Spark SQL来执行递归查询,查询部门ID为4的部门的所有上级部门:

import org.apache.spark.sql.SparkSessionval spark = SparkSession.builder().appName("Recursive Query").master("local").getOrCreate()val departmentDF = spark.read.format("jdbc").option("url", "jdbc:mysql://localhost:3306/test").option("dbtable", "department").option("user", "root").option("password", "password").load()departmentDF.createOrReplaceTempView("department")spark.sql("""WITH RECURSIVE department_hierarchy AS (SELECT department_id, parent_department_idFROM departmentWHERE department_id = 4UNION ALLSELECT d.department_id, d.parent_department_idFROM department_hierarchy dhJOIN department d ON dh.parent_department_id = d.department_id)SELECT *FROM department_hierarchy
""").show()

上述示例中,我们使用Spark SQL的WITH RECURSIVE语法来定义一个递归查询视图department_hierarchy。起始查询使用了WHERE子句来找到部门ID为4的部门,然后使用UNION ALL子句将递归部分与起始部分联接起来,直到找到根部门为止。最后,我们通过SELECT语句从递归查询视图中选择所需的列。

运行以上代码,我们可以得到结果如下:

+-------------+-------------------+
|department_id|parent_department_id|
+-------------+-------------------+
|            4|                  3|
|            3|                  2|
|            2|                  1|
|            1|               NULL|
+-------------+-------------------+

总结

本文中,我们介绍了如何使用Scala中的Spark SQL来执行递归查询。我们首先了解了递归查询的概念和用法,然后通过一个具体的示例演示了如何使用Spark SQL进行递归查询。通过使用Spark SQL的WITH RECURSIVE语法,我们可以方便地处理复杂的递归查询操作,从而更好地利用Spark处理大规模结构化数据。

参考文档如下:

相关文章:

使用spark进行递归的可行方案

在实际工作中会遇到,最近有需求将产品炸开bom到底层,但是ERP中bom数据在一张表中递归存储的,不循环展开,是无法知道最底层原材料是什么。 在ERP中使用pl/sql甚至sql是可以进行炸BOM的,但是怎么使用spark展开&#xff0…...

Spring -Spring之依赖注入源码解析(下)--实践(流程图)

IOC依赖注入流程图 注入的顺序及优先级:type-->Qualifier-->Primary-->PriOriry-->name...

前端设计模式之【单例模式】

文章目录 前言介绍实现单例模式优缺点?后言 前言 hello world欢迎来到前端的新世界 😜当前文章系列专栏:前端设计模式 🐱‍👓博主在前端领域还有很多知识和技术需要掌握,正在不断努力填补技术短板。(如果出…...

设备零部件更换ar远程指导系统加强培训效果

随着科技的发展,AR技术已经成为了一种广泛应用的新型技术。AR远程指导系统作为AR技术的一种应用,具有非常广泛的应用前景。 一、应用场景 气象监测AR教学软件适用于多个领域,包括气象、环境、地理等。在教学过程中,软件可以帮助学…...

文本生成高精准3D模型,北京智源AI研究院等出品—3D-GPT

北京智源AI研究院、牛津大学、澳大利亚国立大学联合发布了一项研究—3D-GPT,通过文本问答方式就能创建高精准3D模型。 据悉,3D-GPT使用了大语言模型的多任务推理能力,通过任务调度代理、概念化代理和建模代理三大模块,简化了3D建模的开发流程…...

Netty入门指南之NIO 网络编程

作者简介:☕️大家好,我是Aomsir,一个爱折腾的开发者! 个人主页:Aomsir_Spring5应用专栏,Netty应用专栏,RPC应用专栏-CSDN博客 当前专栏:Netty应用专栏_Aomsir的博客-CSDN博客 文章目录 参考文献前言基础扫…...

LeetCode(6)轮转数组【数组/字符串】【中等】

目录 1.题目2.答案3.提交结果截图 链接: 189. 轮转数组 1.题目 给定一个整数数组 nums,将数组中的元素向右轮转 k 个位置,其中 k 是非负数。 示例 1: 输入: nums [1,2,3,4,5,6,7], k 3 输出: [5,6,7,1,2,3,4] 解释: 向右轮转 1 步: [7,1…...

华为云Ascend310服务器使用

使用华为云服务器 cpu: 16vCPUs Kunpeng 920 内存:16GiB gpu:4* HUAWEI Ascend 310 cann: 20.1.rc1 操作系统:Ubuntu aarch64目的 使用该服务器进行docker镜像编译,测试模型。 已知生产环境:mindx版本为3.0.rc3&a…...

【poi导出excel模板——通过建造者模式+策略模式+函数式接口实现】

poi导出excel模板——通过建造者模式策略模式函数式接口实现 poi导出excel示例优化思路代码实现补充建造者模式策略模式 poi导出excel示例 首先我们现看一下poi如何导出excel&#xff0c;这里举个例子&#xff1a;目前想要导出一个Map<sex,List>信息&#xff0c;sex作为…...

自适应模糊PID控制器在热交换器温度控制中的应用

热交换器是一种常见的热能传递设备&#xff0c;广泛应用于各个工业领域。对热交换器温度进行有效控制具有重要意义&#xff0c;可以提高能源利用效率和产品质量。然而&#xff0c;受到热传导特性和外部环境变化等因素的影响&#xff0c;热交换器温度控制难度较大。本文提出一种…...

【系统救援】 Ubuntu重启失败,报错:UNEXPECTED INCONSISTENCY; RUN fsck MANUALLY

问题定位及处理 查看错误信息&#xff1a;/dev/sda3 contains a file system with errors, check forced. /dev/sda3: Inodes that were part of a corrupted orphan linked list found. /dev/sda3: UNEXPECTED INCONSISTENCY; RUN fsck MANUALLY. (i.e., without -a or -p o…...

【数据结构】树与二叉树(八):二叉树的中序遍历(非递归算法NIO)

文章目录 5.2.1 二叉树二叉树性质引理5.1&#xff1a;二叉树中层数为i的结点至多有 2 i 2^i 2i个&#xff0c;其中 i ≥ 0 i \geq 0 i≥0。引理5.2&#xff1a;高度为k的二叉树中至多有 2 k 1 − 1 2^{k1}-1 2k1−1个结点&#xff0c;其中 k ≥ 0 k \geq 0 k≥0。引理5.3&…...

第九章 排序【数据结构】【精致版】

第九章 排序【数据结构】【精致版】 前言版权第九章 排序9.1 概述9.2 插入类排序9.2.1 直接插入排序**1-直接插入排序.c** 9.2.2 折半插入排序**2-折半插入排序.c** 9.2.3 希尔排序 9.3 交换类排序9.3.1冒泡排序**4-冒泡排序.c** 9.3.2 快速排序**5-快速排序.c** 9.4 选择类排…...

基于element-plus定义表格行内编辑配置化

文章目录 前言一、新增table组件二、使用步骤 前言 在 基于element-plus定义表单配置化 基础上&#xff0c;封装个Element-plus的table表格 由于表格不同于form组件&#xff0c;需自定义校验器&#xff0c;以下组件配置了单个校验&#xff0c;及提交统一校验方法&#xff0c;且…...

WebGL-Vue3-TS-Threejs:基础练习 / Javascript 3D library / demo

一、理解Three.js Three.js是一个用于WebGL渲染的JavaScript库。它提供了一组工具和类&#xff0c;用于创建和渲染3D图形和动画。简单理解&#xff08;并不十分准确&#xff09;&#xff0c;Three.js之于WebGL&#xff0c;好比&#xff0c;jQuery.js之于JavaScript。 OpenGL …...

2022年12月 Python(四级)真题解析#中国电子学会#全国青少年软件编程等级考试

Python等级考试(1~6级)全部真题・点这里 一、单选题(共25题,每题2分,共50分) 第1题 有n个按名称排序的商品,使用对分查找法搜索任何一商品,最多查找次数为5次,则n的值可能为?()(2分) A.5 B.15 C.30 D.35 答案:C 答案解析:对分查找最多查找次数m与个数之间n的…...

确定性 vs 非确定性:GPT 时代的新编程范式

分享嘉宾 | 王咏刚 责编 | 梦依丹 出品 | 《新程序员》编辑部 在 ChatGPT 所引爆的新一轮编程革命中&#xff0c;自然语言取代编程语言&#xff0c;在只需编写提示词/拍照就能出程序的时代&#xff0c;未来程序员真的会被简化为提示词的编写员吗&#xff1f;通过提示词操纵 …...

【Linux奇遇记】我和Linux的初次相遇

&#x1f308;个人主页: Aileen_0v0 &#x1f525;系列专栏:Linux奇遇记系列专栏&#x1f4ab;"没有罗马,那就自己创造罗马~" 目录 前端和后端的介绍 1.前端 2.后端 3.前后端区别 Linux在前后端开发中的角色 如何学习Linux 去进行程序开发 Linux的常见根目…...

剪贴板劫持--PasteJacker的使用

启动 PasteJacker [1] Windows [2] Linux [3] Exit第一次是让我们选择要攻击针对的目标系统&#xff0c;这里以Windows系统为例&#xff0c;即我自己的物理机 因此键入 1 &#xff0c;回车 [1] Download and execute a msfvenom backdoor using certutil (Web delivery Past…...

说一下vue2的响应式原理?

vue2采用数据代理数据劫持发布订阅模式的方法。 在初始化vue实例时&#xff0c;会把data对象和data对象的属性都添加到vm对象中&#xff0c;通过object.defineProperty()进行数据代理&#xff0c;用vm对象的属性来代理data对象的属性&#xff0c;并在Observer类中递归遍历data…...

大模型能力评估全景图:主流Benchmark深度解析

大模型能力评估全景图:主流 Benchmark 深度解析 引言 随着大语言模型(LLM)的快速发展,如何科学、全面地评估模型能力成为研究界和工业界共同关注的焦点。Benchmark 作为衡量模型性能的标尺,不仅帮助我们理解模型的强项与局限,也为模型迭代优化提供了明确方向。 本文将…...

终极指南:3步解锁百度网盘SVIP高速下载功能(macOS版)

终极指南&#xff1a;3步解锁百度网盘SVIP高速下载功能&#xff08;macOS版&#xff09; 【免费下载链接】BaiduNetdiskPlugin-macOS For macOS.百度网盘 破解SVIP、下载速度限制~ 项目地址: https://gitcode.com/gh_mirrors/ba/BaiduNetdiskPlugin-macOS 还在为百度网盘…...

替换镜像接口提升AI调用稳定性

要替换不稳定的第三方镜像接口以提升AI机器人调用的稳定性&#xff0c;核心在于选择并集成一个可靠、高性能且具备良好兼容性的AI服务后端。这通常涉及以下几个关键步骤&#xff1a;评估与选择稳定API源、配置本地或云端模型服务、以及优化调用逻辑与错误处理机制。 1. 核心方…...

Win11Debloat:专业级Windows系统优化与隐私保护完整解决方案

Win11Debloat&#xff1a;专业级Windows系统优化与隐私保护完整解决方案 【免费下载链接】Win11Debloat A simple, lightweight PowerShell script that allows you to remove pre-installed apps, disable telemetry, as well as perform various other changes to declutter …...

从Xmodem到Ymodem:一个老牌文件传输协议在IoT设备调试中的“复活”实战

Ymodem协议在物联网设备调试中的高效实践 在物联网设备开发过程中&#xff0c;文件传输是一个看似简单却充满挑战的任务。当面对资源受限的嵌入式设备时&#xff0c;传统的网络协议栈往往显得过于庞大&#xff0c;而简单的串口通信又难以满足可靠性需求。正是在这样的背景下&am…...

接手一个烂摊子之后:金仓数据库开发规范实战笔记

接手一个烂摊子之后&#xff1a;金仓数据库开发规范实战笔记 从一个凌晨三点的故障说起 去年接手一个电商中台项目&#xff0c;上线才两个月就开始频繁出问题。 最严重的一次是凌晨三点&#xff0c;订单创建接口大面积超时。排查到最后发现是一张订单表&#xff0c;三个月的数据…...

SSD202开发环境搭建踩坑实录:Ubuntu 16.04下交叉编译工具链配置与内核编译

SSD202开发环境深度构建指南&#xff1a;从工具链配置到内核编译实战 引言&#xff1a;为什么选择Ubuntu 16.04作为SSD202开发环境&#xff1f; 在嵌入式开发领域&#xff0c;环境配置往往比想象中更具挑战性。特别是对于SSD202这类采用ARM Cortex-A7架构的芯片&#xff0c;开发…...

Bidili Generator图片生成工具:5分钟快速部署,小白也能玩转SDXL定制化AI绘画

Bidili Generator图片生成工具&#xff1a;5分钟快速部署&#xff0c;小白也能玩转SDXL定制化AI绘画 1. 引言&#xff1a;让AI绘画变得简单 你是否曾经羡慕那些能够用AI生成精美图片的技术达人&#xff1f;现在&#xff0c;这一切变得前所未有的简单。Bidili Generator是一款…...

AI Agent开发6种实用设计模式:小白程序员必备收藏,快速提升实战能力!

本文介绍了AI Agent开发的六种核心设计模式&#xff0c;包括ReAct、Tool Use、Reflection、Planning、Multi-Agent和Human-in-the-Loop&#xff0c;详细讲解了每种模式的核心思想、优缺点、适用场景及Java代码实现。文章强调了选择合适模式的重要性&#xff0c;并建议从简单的R…...

告别模拟器:用Termux+Ubuntu+JDK在安卓手机上搭建轻量Java开发环境

安卓手机变身Java开发机&#xff1a;TermuxUbuntuJDK全栈解决方案 在咖啡馆等朋友时突然需要调试一段业务逻辑代码&#xff0c;出差途中发现线上服务报错需要紧急修复&#xff0c;通勤路上想继续昨晚未完成的算法练习——这些场景下&#xff0c;我们往往懊恼没带笔记本电脑。其…...