开发者社区 > 大数据与机器学习 > 大数据计算 MaxCompute > 正文

在大数据计算MaxCompute中,可以实现这个功能嘛?

在大数据计算MaxCompute中,我这边有个需求,根据商品维度统计,每件商品的断货时长;假设表名为:表A,里面有4个字段,分别是商品名称、可售库存数、预留库存数、每天库存同步时间(yyyy-MM-dd)
如果可售库存数+预留库存数=0,代表缺货1天,然后往前推算一天;如果昨天,可售库存数+预留库存数还是0的话,代表缺货2天,一直往前推送,直到2个数相加>0为止,MaxCompute可以实现这个功能嘛?有没有参考示例,借鉴一下

展开
收起
LLLA 2024-01-23 22:46:29 59 0
3 条回答
写回答
取消 提交回答
  • 面对过去,不要迷离;面对未来,不必彷徨;活在今天,你只要把自己完全展示给别人看。

    在大数据计算MaxCompute中,可以实现根据商品维度统计每件商品的断货时长的功能。可以使用SQL语句结合自定义函数(UDF)来实现这个需求。

    首先,你需要创建一个自定义函数(UDF),用于计算商品的断货时长。这个UDF可以接收一个包含商品库存信息的表作为输入,并返回一个包含商品名称和断货时长的新表。

    以下是一个示例的UDF代码:

    # 导入必要的库
    from pyodps import ODPS
    
    # 创建ODPS实例
    odps = ODPS('<your_access_id>', '<your_access_key>')
    
    # 定义UDF函数
    def calculate_out_of_stock_duration(table):
        # 获取当前日期
        current_date = table['每天库存同步时间'].max()
    
        # 初始化断货时长为0
        out_of_stock_duration = 0
    
        # 循环遍历每一天的数据
        for date in reversed(table['每天库存同步时间'].unique()):
            # 获取前一天的库存信息
            previous_day_data = table[table['每天库存同步时间'] == date + timedelta(days=1)]
    
            # 判断前一天是否缺货
            if (previous_day_data['可售库存数'] + previous_day_data['预留库存数']) == 0:
                # 如果前一天缺货,增加断货时长
                out_of_stock_duration += 1
            else:
                # 如果前一天不缺货,结束循环
                break
    
        # 返回结果
        return out_of_stock_duration
    
    # 调用UDF函数
    result = calculate_out_of_stock_duration(tableA)
    

    以上代码中的calculate_out_of_stock_duration函数接收一个名为tableA的表作为输入,其中包含了商品名称、可售库存数、预留库存数和每天库存同步时间的字段。函数会从最新的日期开始往前遍历,判断每一天是否缺货,直到找到第一个不缺货的日期为止。最后,函数返回商品的断货时长。

    请注意替换代码中的<your_access_id><your_access_key>为你自己的访问ID和访问密钥。此外,还需要确保已经安装了相应的Python库(如pyodps)以便与MaxCompute进行交互。

    2024-01-24 13:34:33
    赞同 展开评论 打赏
  • 在阿里云MaxCompute中,可以实现这个功能。不过由于MaxCompute不支持直接的循环或递归查询,需要通过SQL的窗口函数、自连接或者其他聚合方法来模拟这个逻辑。以下是一个基于窗口函数和累计求和的方法示例,用于计算每件商品连续断货的天数:

    -- 假设表A结构如下:
    CREATE TABLE IF NOT EXISTS A (
        product_name STRING,
        saleable_stock INT,
        reserved_stock INT,
        sync_time DATE
    );
    
    -- 先计算每天每个商品是否有库存(可售+预留>0)
    WITH inventory_status AS (
        SELECT 
            product_name,
            sync_time,
            CASE WHEN saleable_stock + reserved_stock > 0 THEN 1 ELSE 0 END as has_stock
        FROM 
            A
    )
    
    -- 使用窗口函数向前累积求和,直到遇到非0值,计算连续缺货天数
    SELECT 
        product_name,
        MIN(sync_time) as start_date_of_out_of_stock,
        MAX(sync_time) as end_date_of_out_of_stock,
        COUNT(*) - 1 as days_of_continuous_out_of_stock -- 减1是因为最后一行是结束断货状态
    FROM (
        SELECT 
            product_name,
            sync_time,
            SUM(has_stock) OVER (PARTITION BY product_name ORDER BY sync_time ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) as stock_running_sum
        FROM 
            inventory_status
    ) T
    WHERE 
        stock_running_sum = 0
    GROUP BY 
        product_name, 
        (stock_running_sum - has_stock); -- 这里根据前后两行has_stock的变化分组,形成连续缺货周期
    
    -- 如果有特殊情况,比如第一天就是缺货,则可能需要额外处理
    

    这段SQL假设了sync_time字段按照日期升序排列,并且每天都有记录。实际应用时,可能需要根据实际情况调整逻辑。

    请注意,这个示例中的逻辑可能会因数据分布和其他因素而有所不同,具体实现时请结合实际业务场景进行调整和优化。此外,如果存在多个商品同时断货的情况,上述SQL可能需要进一步改进以确保结果正确。

    2024-01-23 22:56:39
    赞同 展开评论 打赏
  • 没有现成的例子。这里面有几个场景可以用一些内建函数解决。
    LAG函数获取前一天的可售库存数+预留库存数。
    https://help.aliyun.com/zh/maxcompute/user-guide/lag?spm=a2c4g.11186623.0.i5

    用case when判断缺货,用count统计天数。 此回答来自钉群“MaxCompute开发者社区1群”

    2024-01-23 22:55:17
    赞同 展开评论 打赏

MaxCompute(原ODPS)是一项面向分析的大数据计算服务,它以Serverless架构提供快速、全托管的在线数据仓库服务,消除传统数据平台在资源扩展性和弹性方面的限制,最小化用户运维投入,使您经济并高效的分析处理海量数据。

相关产品

  • 云原生大数据计算服务 MaxCompute
  • 相关电子书

    更多
    Data+AI时代大数据平台应该如何建设 立即下载
    大数据AI一体化的解读 立即下载
    极氪大数据 Serverless 应用实践 立即下载