在 Redshift 中确定字段的字节

Posted

技术标签:

【中文标题】在 Redshift 中确定字段的字节【英文标题】:Determine field's bytes in Redshift 【发布时间】:2014-07-31 20:28:58 【问题描述】:

我正在将一个表从 SQL Server 移动到 Redshift。我已导出数据并将其放入 UTF-8 文本文件中。尝试加载到 Redshift 时,COPY 命令失败,抱怨数据超出了字段的宽度。

目标 Redshift 表架构与源 SQL Server 表的架构匹配(即 varchar 字段宽度相同)。如果我理解正确,Redshift 的 varchar 大小以字节为单位,而不是字符,如 SQL Server。所以,多字节字符会导致“太宽”的问题。

我想运行一个查询来确定我的 varchar 字段有多大,但似乎没有一个函数可以返回字符串所需的字节数,只返回该字符串中的字符数。

其他人是如何解决这个问题的?

【问题讨论】:

SQL Server 数据类型是varchar 还是nvarchar?如果是nvarchar,那么在迁移到 Redshift 时,您需要将 SQL 服务器的最大长度加倍,即 nvarchar(50) 变为 varchar(100) VARCHAR 数据类型支持最多四个字节的 UTF-8 多字节字符。不支持五字节或更长的字符。要计算包含多字节字符的 VARCHAR 列的大小,请将字符数乘以每个字符的字节数。例如,如果一个字符串有四个汉字,每个字符是三个字节长,那么您将需要一个 VARCHAR(12) 列来存储该字符串。 Brian,在两个数据库中,字段都定义为 varchar(不是 nvarchar) Sandesh - 这正是问题所在 - 在 65 亿行中查找每个字符的字节数,每行有 5 个潜在问题字段。 托德,桑德什有正确的答案。如果 SQL Server 中的字段是 varchar(3),那么您只需将字段长度乘以 4,然后在 Redshift 中使用 varchar(12)(尽管我们发现 x3 适用于所有迁移的数据)。如果您不想使用该默认配置,则必须在 SQL Server 中运行 max(length()) 操作,然后将其乘以 4,尽管这对于未来可能存在的源数据而言并不是非常安全更长。 【参考方案1】:

字段长度和字段类型在 Redshift 中可能很关键。将样本数据加载到具有最大字段大小的 RedShift 表中。样品必须尽可能大。比您能够计算实际字段大小而忽略 MSSQL Server 中的定义,这可能比您真正需要的要大得多。

【讨论】:

以上是关于在 Redshift 中确定字段的字节的主要内容,如果未能解决你的问题,请参考以下文章

DatagGrip 无法识别 Redshift 特定命令

将 IntelliJ 连接到 Amazon Redshift

Redshift 终止长时间运行的查询

(REDSHIFT) 垂直合并 / FIRST_VALUE() 作为聚合

尝试使用 node-redshift 从节点连接到 redshift 时超时

如何在架构上同步应用程序工程师 (Postgres) 和数据工程师 (Redshift)