创建表时,如果列值超过长度,如何修剪 DDL 中的 varchar -redshift

问题描述 投票:0回答:2

字符串超出 ddl 长度错误:

我想使用 ddl 在 redshift 中创建一个表,指定在超出所提到的字符数时进行修剪。有办法吗

我尝试使用“Cast”插入,但它不适用于自动化。所以它必须在 ddl 中。有什么办法吗?

casting amazon-redshift trim ddl
2个回答
0
投票

SUBSTRING() 是缩短字符串的函数。您可以只插入从字符 1 到 DDL 长度的 SUBSTRING,这将防止正常 ASCII 字符出现任何溢出。听起来长字符串已经在数据库中,所以您不需要进行 COPY 解决这个问题,对吗?

现在,如果您的字符串是 VARCHAR 类型并且嵌入了多字节字符,那么您的问题会稍微困难一些。由于多字节字符占用超过 1 个 VARCHAR DDL 长度“槽”,因此您可能需要将字符串大小减少到超过字符数差异。字符串函数 OCTET_LENGTH() 将给出字符串的 VARCHAR DDL 长度,如果字符串包含多字节字符,则该长度将大于字符串字符中的 LENGTH()。您可以利用此差异在多字节情况下删除一些额外的字符。像这样的东西应该适用于这两种情况:

INSERT INTO <target> 
    SELECT SUBSTRING(<string-col>, 1, <ddl-length> - OCTET_LENGTH(<string-col>) + LENGTH(<string-col>) 
    FROM <source>

0
投票

比尔·韦纳的回答很有用。我做了类似的事情,但由于我是在 PySpark 应用程序中生成 SQL 命令,所以我修剪了数据(也使用 SUBSTRING())并应用了 percentage 来处理特殊字符:

cmd = f"UPDATE {target} {string_col} SET {string_col} = substring({string_col}, 1, {int(0.90*ddl_length})"

您提到了 Redshift 和自动化。我的团队在自动处理 DDL 错误方面遇到了困难。我们提出了一个解决方案,涉及在 DDL 中创建一个具有更长 VARCHAR 长度的临时表,并从 S3 复制数据。在这个临时表中,我们对数据进行子串并最终复制到生产表,并记录更改以便稍后采取操作。这使管道保持运行。

我们选择临时表是因为我们不想在生产表中自动执行 DDL 更改。我认为如果您有 SCD 表,这可能会变得很棘手。

如果你想看一下,我写了一篇关于它的Medium文章

© www.soinside.com 2019 - 2024. All rights reserved.