通过读取两个 odps中的dataframe A和 B,
A[['apply_no']].setdiff(B[[B.index.rename('apply_no')]]) 报错 Do not allow python UDF in project:
如果我直接写
A[['apply_no']].setdiff(B.index.rename('apply_no')) 报错not all arguments converted during string formatting,
这是本身数据的问题,还是这个function 不能在公共云中用?如果是数据的问题,为什么B表可以保存进odps中,因为B表示通过A表解析生成的。
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。
从您提供的错误信息来看,问题并不直接源于数据本身,而是与您尝试使用的操作或函数在MaxCompute(原名ODPS)中的支持情况有关。
关于第一个错误:"Do not allow python UDF in project",这表明您可能尝试使用了Python UDF(用户自定义函数),而MaxCompute项目配置可能不允许执行Python UDF。MaxCompute支持Java UDF和SQL UDF,对于Python UDF的支持则依赖于特定的项目设置和版本。如果您确实需要使用Python UDF,需要确保您的项目已正确配置并允许此类操作。
关于第二个错误:"not all arguments converted during string formatting",这个错误通常发生在字符串格式化操作中,当提供的参数数量或类型与格式字符串不匹配时。在这个上下文中,可能是由于B.index.rename('apply_no')的结果被误解为需要进行字符串格式化的地方,但实际上您是想将其作为索引进行比较。MaxCompute的DataFrame操作与Pandas有所不同,它不支持类似Pandas的某些操作,如直接的.index.rename()方法。
针对您的需求,如果您想要找出A表中存在但B表中不存在的apply_no值,您可以考虑使用MaxCompute的SQL语句来实现这一逻辑,例如:
SELECT apply_no FROM A
MINUS
SELECT apply_no FROM B;
或者,如果您已经将数据加载到了DataFrame中,且必须使用DataFrame操作,您可能需要通过其他方式重构您的逻辑,比如先将B表的索引转换为一个包含apply_no列的新DataFrame,然后再进行比较。但请注意,MaxCompute DataFrame API可能不直接支持类似于Pandas的setdiff操作,因此直接转换思路为SQL查询可能是更直接且有效的方法。
确保在操作前检查您的MaxCompute版本和功能支持,以及项目的配置,以避免遇到权限或功能不支持的问题。