ODPS Python3开发UDF实践 dataworks平台

本文涉及的产品
大数据开发治理平台DataWorks,Serverless资源组抵扣包300CU*H
云原生大数据计算服务 MaxCompute,5000CU*H 100GB 3个月
云原生大数据计算服务MaxCompute,500CU*H 100GB 3个月
简介: # 业务背景 花呗有一个生息产品叫做循环, 也就最低还款: 即每月进行最小还款, 剩下的金额产生利息. 用户每个月都可以进行最低还款的办理, 即还不掉的本金永远在里面滚着. 业务方想要知道一个业务指标, 就是用户连续办理了多少个月的循环, 然后针对这部分用户做精细化运营 # 解决思路 这个问题有两个解法 #### 1. ODPS SQL解法 每月月末跑一个数, 统计本月用户

业务背景

花呗有一个生息产品叫做循环, 也就最低还款: 即每月进行最小还款, 剩下的金额产生利息.
用户每个月都可以进行最低还款的办理, 即还不掉的本金永远在里面滚着.
业务方想要知道一个业务指标, 就是用户连续办理了多少个月的循环, 然后针对这部分用户做精细化运营

解决思路

这个问题有两个解法

1. ODPS SQL解法

每月月末跑一个数, 统计本月用户是否使用过循环, 开始月份是X月, X+1月有用过则把连续循环数+1, 没有用过则置零. 该方法的缺点是时效性问题, 即月末才能看到数据, 有些用户在月中就完成循环了.

2. ODPS UDF解法

拉取用户历史以来循环办理日期(中间层有个全量表可以直接取出数据), 通过日期数组直接判定是否连续循环, 该方法效率快, 准确性高, 数据时效性也好, 唯一麻烦的就是需要自己写UDF

后来评估了两个方法的开发量, 最后决定使用UDF实现这个功能, 所以接下来说说UDF的实践过程

D2开发Python3 UDF的流程简介

1. 本地开发Python3代码

虽然现在D2有Function Studio, 但是它只支持Python2.7, 不支持3的运行
所以我是本地先写个.py实现核心功能, 再弄到D2里面去, 用macOS开个terminal做测试特别方便.

2. 建立资源

2.1 ODPS Python改写

资源说白了就是实现核心功能的py模块, 但是这段代码需要进行ODPS规范的改造
1-引入模块odps.udf, 在每个类前加入一段@annotate的修饰符, 管理入参和出参格式, 但是入参的写法和python语法不太一样, 是遵循了ODPS的语法, 详见4条目
2-同时需要把本地的实现函数改为class
3-并且该类中只能调用evaluate方法实现核心功能

from odps.udf import annotate           # 引入odps包

@annotate("array<string> -> bigint")    # 修饰符, 入参 -> 出参
class CalMaxCycleCnt(object):           # 类名, 即要发布的函数名称
    def evaluate(self, date_lists):     # 实现方法, 必须写evaluate
        '''
        date_lists.sort(reverse=True)
        实现的功能的核心代码
        '''
        return max_cycle_cnt            # 返回结果, bigint

4-ODPS和PYTHON3参数格式转换
可先下图, 或见链接: https://tech.antfin.com/docs/2/154431
image.png

2.2 D2建立资源流程图

第一步, 新建

image.png

第二步, 填写资源名称

image.png

第三步, 贴上代码+提交发布

image.png

3. 引入函数

资源发布后, 可以把资源中的class作为函数引入到ODPS中

第一步, 新建

image.png

第二步, 填写函数名称, 此处填写class名称

image.png

第三步, 配置函数+提交发布

类名要填资源名称(不含py).类名, 如图中hb_2XXXXXX3_test.CalMaxCycleCnt, 否则定位不到函数
资源列表填资源名称.py即可, 如图中hb_2XXXXXX3_test.py
image.png

4. 线上验收测试

SELECT  user_id
        ,CalMaxCycleCnt( txn_dt_array ) AS max_cycle_cnt
FROM tbl_name

后记

1. 测试难

因为写的Python3, 无法测试环境测, 所以代码要尽可能写的完整, 不然BUG只能通过再次发布来修复

2. 注意NULL值

SQL的入参, 特别是多表关联的时候难免有NULL值, python的代码里面可以加这一段对NULL值初始化

if next_bill_date is None or len(next_bill_date)==0:
    next_bill_date=next_month_fst_day(bizdate)

如果直接对NULL值判定len, 则会报错

TypeError: object of type 'NoneType' has no len()
相关实践学习
基于MaxCompute的热门话题分析
本实验围绕社交用户发布的文章做了详尽的分析,通过分析能得到用户群体年龄分布,性别分布,地理位置分布,以及热门话题的热度。
一站式大数据开发治理平台DataWorks初级课程
DataWorks 从 2009 年开始,十ー年里一直支持阿里巴巴集团内部数据中台的建设,2019 年双 11 稳定支撑每日千万级的任务调度。每天阿里巴巴内部有数万名数据和算法工程师正在使用DataWorks,承了阿里巴巴 99%的据业务构建。本课程主要介绍了阿里巴巴大数据技术发展历程与 DataWorks 几大模块的基本能力。 课程目标 &nbsp;通过讲师的详细讲解与实际演示,学员可以一边学习一边进行实际操作,可以深入了解DataWorks各大模块的使用方式和具体功能,让学员对DataWorks数据集成、开发、分析、运维、安全、治理等方面有深刻的了解,加深对阿里云大数据产品体系的理解与认识。 适合人群 &nbsp;企业数据仓库开发人员 &nbsp;大数据平台开发人员 &nbsp;数据分析师 &nbsp;大数据运维人员 &nbsp;对于大数据平台、数据中台产品感兴趣的开发者
相关文章
|
1月前
|
机器学习/深度学习 算法 搜索推荐
从理论到实践,Python算法复杂度分析一站式教程,助你轻松驾驭大数据挑战!
【10月更文挑战第4天】在大数据时代,算法效率至关重要。本文从理论入手,介绍时间复杂度和空间复杂度两个核心概念,并通过冒泡排序和快速排序的Python实现详细分析其复杂度。冒泡排序的时间复杂度为O(n^2),空间复杂度为O(1);快速排序平均时间复杂度为O(n log n),空间复杂度为O(log n)。文章还介绍了算法选择、分而治之及空间换时间等优化策略,帮助你在大数据挑战中游刃有余。
58 4
|
4天前
|
存储 数据库连接 API
Python环境变量在开发和运行Python应用程序时起着重要的作用
Python环境变量在开发和运行Python应用程序时起着重要的作用
40 15
|
1月前
|
算法 测试技术 开发者
性能优化与代码审查:提升Python开发效率
【10月更文挑战第12天】本文探讨了Python开发中性能优化和代码审查的重要性,介绍了选择合适数据结构、使用生成器、避免全局变量等性能优化技巧,以及遵守编码规范、使用静态代码分析工具、编写单元测试等代码审查方法,旨在帮助开发者提升开发效率和代码质量。
35 5
|
1月前
|
算法 测试技术 开发者
性能优化与代码审查:提升Python开发效率
【10月更文挑战第6天】本文探讨了性能优化和代码审查在Python开发中的重要性,提供了选择合适数据结构、使用生成器、避免全局变量等性能优化技巧,以及遵守编码规范、使用静态代码分析工具、编写单元测试等代码审查方法,旨在帮助开发者提升开发效率和代码质量。
55 5
|
16天前
|
设计模式 前端开发 数据库
Python Web开发:Django框架下的全栈开发实战
【10月更文挑战第27天】本文介绍了Django框架在Python Web开发中的应用,涵盖了Django与Flask等框架的比较、项目结构、模型、视图、模板和URL配置等内容,并展示了实际代码示例,帮助读者快速掌握Django全栈开发的核心技术。
103 45
|
11天前
|
JSON 安全 API
如何使用Python开发API接口?
在现代软件开发中,API(应用程序编程接口)用于不同软件组件之间的通信和数据交换,实现系统互操作性。Python因其简单易用和强大功能,成为开发API的热门选择。本文详细介绍了Python开发API的基础知识、优势、实现方式(如Flask和Django框架)、实战示例及注意事项,帮助读者掌握高效、安全的API开发技巧。
37 3
如何使用Python开发API接口?
|
4天前
|
JSON API 数据格式
如何使用Python开发1688商品详情API接口?
本文介绍了如何使用Python开发1688商品详情API接口,获取商品的标题、价格、销量和评价等详细信息。主要内容包括注册1688开放平台账号、安装必要Python模块、了解API接口、生成签名、编写Python代码、解析返回数据以及错误处理和日志记录。通过这些步骤,开发者可以轻松地集成1688商品数据到自己的应用中。
19 1
|
10天前
|
数据采集 存储 JSON
Python爬虫开发中的分析与方案制定
Python爬虫开发中的分析与方案制定
|
17天前
|
数据可视化 开发者 Python
Python GUI开发:Tkinter与PyQt的实战应用与对比分析
【10月更文挑战第26天】本文介绍了Python中两种常用的GUI工具包——Tkinter和PyQt。Tkinter内置于Python标准库,适合初学者快速上手,提供基本的GUI组件和方法。PyQt基于Qt库,功能强大且灵活,适用于创建复杂的GUI应用程序。通过实战示例和对比分析,帮助开发者选择合适的工具包以满足项目需求。
62 7
|
19天前
|
算法 测试技术 开发者
性能优化与代码审查:提升Python开发效率
探讨了Python开发中性能优化和代码审查的重要性,介绍了选择合适数据结构、使用生成器、避免全局变量等性能优化技巧,以及遵守编码规范、使用静态代码分析工具、编写单元测试等代码审查方法,旨在帮助开发者提升开发效率和代码质量。
40 8