我们利用 AWS Glue 爬网程序提取存储在 Amazon S3 中的 Parquet 文件。爬网程序检测 Parquet 文件的架构和元数据,并在 Amazon Redshift 中创建外部架构/表。我们注意到字符串列在 redshift 中被截断,其检索字符串的长度直到 16383。在 Athena 中,当我们查询 Glue 表时,它会显示正确的长度和完整数据。我们想知道为什么它会截断长度以及我们可以采取什么措施来解决这个问题。
我们尝试将 for 数据类型更改为 varchar 但它抛出频谱扫描错误。我认为这是由于源镶木地板文件数据类型是字符串。
对我来说有点飞跃,但 16,383 个字符的字符串长度几乎恰好是 Redshift 最大 varchar 长度 65,535 字节的 1/4。 此外,Redshift 使用多字节 UTF-8 来编码文本,最多可以使用 4 个字节来存储 1 个字符(但很少这样做)。
我怀疑 Glue 可能会通过(以某种方式)截断您在 Redshift 中看到的数据来“保护”您免受错误的影响。 如果您只能看到 16K 字符,并且如果所有这些字符的长度都是 4 个字节(几乎不可能),那么您将不会看到超出 Redshift 64K varchar 限制的字符串。
可以提供表的DDL和外部表定义吗? Athena 是否使用与 Spectrum 完全相同的数据目录信息?这些将有助于了解可能发生的情况。
我知道这不是一个答案,但希望能很好地引导正在发生的事情。
我遇到了类似的问题,并联系了AWS支持来了解。
使用 Glue 和 Redshift 频谱存在一些限制:https://docs.aws.amazon.com/redshift/latest/mgmt/amazon-redshift-limits.html#amazon-redshift-limits-spectrum
使用时 ION 或 JSON 文件中字符串值的最大大小 AWS Glue 数据目录为 16 KB。如果您这样做,则可以截断该字符串 达到这个极限。