如何避免 Redshift Python UDF 出现 UnicodeDecodeError ascii 错误?
Posted
技术标签:
【中文标题】如何避免 Redshift Python UDF 出现 UnicodeDecodeError ascii 错误?【英文标题】:How can I avoid UnicodeDecodeError ascii error from my Redshift Python UDF? 【发布时间】:2015-10-01 21:22:00 【问题描述】:我正在使用 redshift 用户定义的函数来解释来自 postgresql 的文本,但我收到此错误:
UnicodeDecodeError: 'ascii' codec can't decode byte 0xff in position 0: ordinal not in range(128).
python 代码实际上都没有调用 decode(),但它似乎在后台发生,但我不知道如何阻止它这样做。
udf 的返回类型是 VARCHAR。
【问题讨论】:
不知道你为什么投了反对票...虽然显示你的代码会相当有用。我不做 Redshift,对不起,所以帮不上什么忙。考虑联系亚马逊的支持。 【参考方案1】:由于 Redshift UDF 目前使用 Python 2.7,因此您需要设置默认编码。
CREATE OR REPLACE FUNCTION f_utf8_test(value VARCHAR(128))
RETURNS VARCHAR(128)
STABLE
AS $$
import sys
reload(sys)
sys.setdefaultencoding("utf-8")
a=value
return a
$$ LANGUAGE plpythonu;
【讨论】:
【参考方案2】:你是怎么弄到 0xff 的? Redshift 以 UTF-8 编码,因此不应该在其中。尝试找到它并追踪它的存在原因
【讨论】:
在客户端正常显示?如果是这样,那么它不会保存为 0xff,您必须提供代码,以便我们可以看到您在哪里从 utf 转换为 ascii【参考方案3】:Redshift 的 Python 引擎是 Python2,因此字符串是字节字符串,而不是 unicode 字符串,而且 Redshift 奇怪地假设从 python UDF 返回的字节字符串是 ASCII。您没有指定,但我假设您返回的是 VARCHAR。您可能只需要在您的 python 字符串上调用.decode('utf-8')
,然后再返回它。
【讨论】:
以上是关于如何避免 Redshift Python UDF 出现 UnicodeDecodeError ascii 错误?的主要内容,如果未能解决你的问题,请参考以下文章
您可以从 Redshift 中的 python UDF 返回多个值吗?
使用自定义 Python 库 ua-parser 的 Amazon Redshift UDF
Redshift 中的 Python UDF 函数始终返回 NULL 值