• 使用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。我们想要查询一个部门的所有上级部门直到根部门的层级关系。以下是一个简化的部门表结构和数据:

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

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

    1. import org.apache.spark.sql.SparkSession
    2. val spark = SparkSession.builder()
    3. .appName("Recursive Query")
    4. .master("local")
    5. .getOrCreate()
    6. val departmentDF = spark.read
    7. .format("jdbc")
    8. .option("url", "jdbc:mysql://localhost:3306/test")
    9. .option("dbtable", "department")
    10. .option("user", "root")
    11. .option("password", "password")
    12. .load()
    13. departmentDF.createOrReplaceTempView("department")
    14. spark.sql("""
    15. WITH RECURSIVE department_hierarchy AS (
    16. SELECT department_id, parent_department_id
    17. FROM department
    18. WHERE department_id = 4
    19. UNION ALL
    20. SELECT d.department_id, d.parent_department_id
    21. FROM department_hierarchy dh
    22. JOIN department d ON dh.parent_department_id = d.department_id
    23. )
    24. SELECT *
    25. FROM department_hierarchy
    26. """).show()

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

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

    1. +-------------+-------------------+
    2. |department_id|parent_department_id|
    3. +-------------+-------------------+
    4. | 4| 3|
    5. | 3| 2|
    6. | 2| 1|
    7. | 1| NULL|
    8. +-------------+-------------------+

    总结

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

    参考文档如下:

  • 相关阅读:
    msvcr110dll是干嘛的,win系统提示缺少msvcr110.dll解决步骤分享
    C语言学习记录(三)之操作符
    (附源码)springboot掌上博客系统 毕业设计063131
    函数指针与回调函数
    JAVA——异常
    layui2.9.7-入门初学
    Stream流式编程,让代码变优雅
    数据处理技巧(8):MATLAB读取txt文本数据并转换成列向量
    厚壁菌门/拟杆菌门——肠道菌群的阴阳面,代表什么
    360度 EC11 旋转编码器模块 数字脉冲电位器
  • 原文地址:https://blog.csdn.net/biqidaoer/article/details/134324336