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

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

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

展开方法

有以下步骤:

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

优点:可行,且效率很快

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

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

实际效果:

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

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

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

  1. 使用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的部门的所有上级部门:

sql 复制代码
import org.apache.spark.sql.SparkSession

val 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_id
        FROM department
        WHERE department_id = 4
        UNION ALL
        SELECT d.department_id, d.parent_department_id
        FROM department_hierarchy dh
        JOIN 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语句从递归查询视图中选择所需的列。

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

sql 复制代码
+-------------+-------------------+
|department_id|parent_department_id|
+-------------+-------------------+
|            4|                  3|
|            3|                  2|
|            2|                  1|
|            1|               NULL|
+-------------+-------------------+

总结

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

参考文档如下:

相关推荐
数字新视界8 小时前
信创动环监控在机房环境管理中的智能化应用与实践分析
大数据·人工智能·物联网·信息与通信·动环监控系统
大大大大晴天13 小时前
数仓分层架构设计:ODS、DWD、DWS、ADS、DIM 如何各司其职
大数据
东鸿电子Eastron20 小时前
工厂节能降本落地指南:从精准能源计量搭建数字化管理基础
大数据·人工智能·能源·智能电表·能耗管理
吾AI科技20 小时前
基于Tez引擎的 Hive SQL 性能优化 —— 为什么脚本运行越来越慢
大数据·hive·性能优化·tez
kiwixing1 天前
GaussDB|集中式还是分布式?三把尺子选型
分布式·gaussdb
真上帝的左手1 天前
30. 技术专题-‌应用框架组件-分布式架构
分布式·架构·系统架构·分布式架构
P1Browser2 天前
账号触发平台安全审核?拆解标准申诉流程与材料清单
大数据·人工智能·安全·多账号管理·指纹浏览器·账户安全·运营合规
云南新人和数采集团2 天前
云南靠谱软件开发公司选型指南:以昆明新腾科技为例
大数据·人工智能·科技
AllData公司负责人2 天前
AI大模型数据开发底座系列说明书:AllData集成DB-GPT开源项目建设 AI 多模态分析底座,涵盖模态解析/智能大屏/MCP 扩展!
大数据·数据库·人工智能·gpt·数据采集·数据接入·模态解析
Lansonli2 天前
大数据Spark(八十八):Spark任务资源之Standalone集群测试
java·服务器·spark