如何避免 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 时出错

您可以从 Redshift 中的 python UDF 返回多个值吗?

使用自定义 Python 库 ua-parser 的 Amazon Redshift UDF

Redshift 中的 Python UDF 函数始终返回 NULL 值

在每个函数调用上导入 Redshift Python UDF

在 Redshift 中使用 python UDF 中的表