【问题标题】:How to generate 12 digit unique number in redshift?如何在红移中生成 12 位唯一数字?
【发布时间】:2018-03-16 16:12:22
【问题描述】:

我在一个表中有 3 列,即email_idridfinal_id

ridfinal_id 的规则:

  1. 如果email_id 有对应的rid,则使用rid 作为final_id
  2. 如果email_id没有对应的rid(即rid为空),生成一个唯一的12位数字并插入final_id字段。

如何在 redshift 中生成 12 位唯一数字?

【问题讨论】:

  • 有一种方法可以加入timestamp、random_number、row_number生成12位数字。然而,这不是一个内置的方法,更多的是一种破解。也可以使用coalesce(rid, <12 digit int generation>)查看规则。

标签: amazon-web-services amazon-redshift amazon-redshift-spectrum


【解决方案1】:

只是添加到接受的响应中:

使用uuid.uuid1().__str__()uuid.uuid4().__str__() 会得到XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX 这样的值。这作为 uuid 是完全有效的,但摆脱散列的一种巧妙方法是使用 hex 属性:

CREATE OR REPLACE FUNCTION public.fn_uuid()
RETURNS character varying AS
' import uuid
 return uuid.uuid4().hex
 '
LANGUAGE plpythonu VOLATILE;

CREATE OR REPLACE FUNCTION public.fn_uuid()
RETURNS character varying AS
' import uuid
 return uuid.uuid1().hex
 '
LANGUAGE plpythonu VOLATILE;

这将为您提供不带哈希的值,因此只有 32 个十六进制字符。

【讨论】:

    【解决方案2】:

    来自Creating a UUID function in Redshift

    默认情况下,AWS Redshift 中没有 UUID 函数。但是使用 Python 用户定义函数,您可以轻松地在 Redshift 中创建 UUID 函数。

    如果你想要随机 UUID:

    CREATE OR REPLACE FUNCTION public.fn_uuid()
    RETURNS character varying AS
    ' import uuid
     return uuid.uuid4().__str__()
     '
    LANGUAGE plpythonu VOLATILE;
    

    如果你想要顺序 UUID:

    CREATE OR REPLACE FUNCTION public.fn_uuid()
    RETURNS character varying AS
    ' import uuid
     return uuid.uuid1().__str__()
     '
    LANGUAGE plpythonu VOLATILE;
    

    【讨论】:

    • 还有其他方法吗?当我收到类似“无效操作:模式公共的权限被拒绝;”之类的错误时。我无权访问公共架构。
    • 您也可以在自己的架构中创建函数。尝试省略 public. 位。
    • 重要 - 根据文档 - 您需要: 从 PUBLIC 撤销对语言 PLPYTHONU 的使用;将语言 PLPYTHONU 的使用授权给 udf_devs 组;或将语言 PLPYTHONU 的使用权限授予用户 youruserid;
    猜你喜欢
    • 2011-01-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-20
    相关资源
    最近更新 更多