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

MaxCompute开发UDTF(python)产生编码错误,参考常见问题无法解决

已解决

问题描述

开发UDTF解析数据记录内容,但部分数据会报错,使用的应该是python2

核心方法代码:

def	process(self, table_name, file_path, content, *outcol):
		definition = json.loads(self.dic[table_name][file_path])
		#content.encode('utf-8', 'replace')
		result = {}
		result['content'] = content
		# 解析过程
		if definition.has_key('schema'):
			self.parser_route(content, definition['schema'], result)
		# 输出结果组装
		out = []
		for col in outcol:
			if result.has_key(col):
				out.append(result[col])
			else:
				out.append(None)
		tupleout = tuple(out)
		if( len(tupleout) > 0 ):
			self.forward(*tupleout)

2022-08-09 17:25:25,630 ERROR [BaseBatchJob.java:272] - Failure Reason:
2022-08-09 17:25:25,630 ERROR [BaseBatchJob.java:274] - ODPS-0123055:Script exception - Traceback (most recent call last):
2022-08-09 17:25:25,631 ERROR [BaseBatchJob.java:274] -   File "<LOG_PARSE_UDTF.py>", line 49, in process
2022-08-09 17:25:25,632 ERROR [BaseBatchJob.java:274] -     self.forward(*tupleout)
2022-08-09 17:25:25,632 ERROR [BaseBatchJob.java:274] - UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-6: ordinal not in range(128)

期望结果

代码能正常执行

已尝试的方法

参考MaxCompute UDF(Python)常见问题 https://help.aliyun.com/document_detail/317787.html#section-u3c-7of-jue

其中现象二

  • 问题现象二:调用Python 2 UDF时,运行报错描述为UnicodeEncodeError: 'ascii' code can't encode characters in position x-y: ordinal not in range(128)
    • 产生原因:函数签名中返回值类型是STRING,但MaxCompute UDF返回UNICODE类型的Python对象,假设对象名为ret。MaxCompute默认会将返回值ret按照ASCII编码格式转换为STR类型,返回str(ret)。当ret本身在ASCII编码范围内时,可以成功转换为STR类型,但如果ret不在ASCII编码范围内时,转换会失败并返回报错。
    • 解决措施:在Python代码的evaluate方法中增加如下语句。

return ret.encode('utf-8')

又报了另外的错:

2022-08-09 17:31:07,431 ERROR [BaseBatchJob.java:272] - Failure Reason:
2022-08-09 17:31:07,432 ERROR [BaseBatchJob.java:274] - ODPS-0123055:Script exception - Traceback (most recent call last):
2022-08-09 17:31:07,434 ERROR [BaseBatchJob.java:274] -   File "<LOG_PARSE_UDTF.py>", line 48, in process
2022-08-09 17:31:07,434 ERROR [BaseBatchJob.java:274] -     tupleout.encode('utf-8')
2022-08-09 17:31:07,434 ERROR [BaseBatchJob.java:274] - AttributeError: 'tuple' object has no attribute 'encode'

返回结果是一个元组,所以不知道这里应该怎么处理?

代码中也尝试将原始记录内容做编码转换

报了如下的错:

2022-08-09 17:06:26,011 ERROR [BaseBatchJob.java:272] - Failure Reason:
2022-08-09 17:06:26,011 ERROR [BaseBatchJob.java:274] - ODPS-0123055:Script exception - Traceback (most recent call last):
2022-08-09 17:06:26,011 ERROR [BaseBatchJob.java:274] -   File "<LOG_PARSE_UDTF.py>", line 34, in process
2022-08-09 17:06:26,012 ERROR [BaseBatchJob.java:274] -     content.encode('utf-8', 'replace')
2022-08-09 17:06:26,012 ERROR [BaseBatchJob.java:274] - UnicodeDecodeError: 'ascii' codec can't decode byte 0xef in position 262: ordinal not in range(128)
2022-08-09 17:06:26,012 ERROR [BaseBatchJob.java:274] - 
2022-08-09 17:06:26,012 ERROR [BaseBatchJob.java:274] - 

展开
收起
游客bcwoetshuuwsq 2022-08-09 17:48:13 136 0
3 条回答
写回答
取消 提交回答
  • 采纳回答

    实际通过异常抛出,发现处理的字符串中有一些特殊字符,类似:2741-��ʫ��-220808M-20220808-121457

    无论使用什么编码方法,都不能针对这类字符串进行转换处理

    最后只能使用兜底代码,解决了问题

    import sysreload(sys)sys.setdefaultencoding('utf-8')

    但使用这个代码的缺点是受沙箱限制,调用udf的sql语句中必须增加参数设置

    set odps.isolation.session.enable = true;

    2022-08-10 11:54:20
    赞同 展开评论 打赏
  • out.append(result[col]) ,可以改成

    if isinstance(result[col], str):

    out.append(result[col])

    elif isinstance(result[col], unicode):

    out.append(result[col].encode('utf-8'))

    2022-08-10 11:01:34
    赞同 展开评论 打赏
  • 1、问题的根因,其实在MaxCompute UDF(Python)常见问题中已经解答了,核心原因是编码格式转换报错;

    2、要解决问题,首先要搞清楚,tupleout里面存储的对象是什么类型及编码格式?

    建议增加如下代码尝试:

    import detect

    result = chardet.detect(result[col])

    print result

    看下字符串到底是啥类型的,然后使用result[col].encode('utf-8')转换

    2022-08-10 00:02:27
    赞同 展开评论 打赏

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

相关产品

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

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