Hi, 我是用的flink1.12的pandas类型的udaf, 代码如下:
@udaf(result_type=DataTypes.FLOAT(), func_type="pandas")
def logReturn(i, j):
df = pd.DataFrame({'id': i, 'rate': j})
df['rate1'] = df['rate'] + 1
return numpy.prod(df['rate1']) - 1
调用方式为:
result = query_table.group_by(query_table.PF_ID).select(query_table.ID,
logReturn(
query_table.ID,
query_table.RATE)).execute_insert('print').wait()
这个代码的sink用的print,,其实之前的to_pandas也是用在最后一步来获取计算结果,用于返回的;
java的写法类似,也是定义了udaf之后执行,返回Table类型的结果,再对这个结构处理,取出计算结果;
但两者的执行时间差很多,python用了很多方式,实现同样的简单计算逻辑,都差不多要8分钟左右。
总感觉时间用在query上,之前使用过flink1.11中connector.read.query方式直接获取数据,计算的速度就很快~
小白一个,不太了解flink内部的设计,希望能在这里找到具体的原因~谢谢您啦~*来自志愿者整理的flink邮件归档
你是拿java写的udaf和pandas udaf做性能对比的吗,你是怎么测试的?你是在哪种场景下使用的pandas udaf?还有就是你用了to_pandas就是sink了,瓶颈就是在这,这玩意儿一般用在debug或者写it用的,不会拿来做性能测试的sink和上生产用的。*来自志愿者整理的flink邮件归档
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。