AWS Redshift 查询过长异常
Posted
技术标签:
【中文标题】AWS Redshift 查询过长异常【英文标题】:AWS Redshift Query too long exception 【发布时间】:2020-11-24 06:45:54 【问题描述】:一直在尝试在 AWS Redshift(类型:RA3.4xLarge)中运行合并查询,其中查询的长度约为 6k 个字符(我知道,非常大!!)。
现在此查询失败并出现以下错误。
psycopg2.errors.InternalError_: Value too long for character type
DETAIL:
-----------------------------------------------
error: Value too long for character type
code: 8001
context: Value too long for type character varying(1)
query: 388111
location: string.cpp:175
process: query0_251_388111 [pid=13360]
-----------------------------------------------
进一步挖掘,发现stl_query
表记录了集群上运行的每个查询,这对querytxt
列有4k 个字符的限制,导致上述整个查询失败。
View "pg_catalog.stl_query"
Column | Type | Modifiers
----------------------------+-----------------------------+-----------
userid | integer |
query | integer |
label | character(320) |
xid | bigint |
pid | integer |
database | character(32) |
querytxt | character(4000) |
starttime | timestamp without time zone |
endtime | timestamp without time zone |
aborted | integer |
insert_pristine | integer |
concurrency_scaling_status | integer |
所以,这里的问题是(除了减少查询长度),有没有解决这种情况的方法?还是我把这整件事都推错了?
【问题讨论】:
【参考方案1】:您的分析偏离了轨道 - 我处理过许多大小超过 4K 的 Redshift 查询(很遗憾)。除非他们在最近的版本中破坏了某些东西,否则这不是您的问题。
首先,stl_query 只存储查询的前 4K 个字符 - 如果您想查看整个长查询,您需要查看表 stl_querytext。请注意,stl_querytext 将查询分成 200 个字符块,您需要使用序列值重新组合它们。
现在您的错误指向一个 varchar(1),一个字节大小的 varchar,作为问题的根源。我会查看您的查询和表以查找 varchar(1) 大小的列,并查看其中放入了什么。您可能需要了解插入的字符串长度以及为什么要找到解决方案。
请记住,在 Redshift 中,非 ascii 字符存储在多个字节中,并且 varchar(1) 是一个字节列。因此,如果您尝试在此列中插入单个非 ascii 字符,它将不适合。如果问题与非 ascii 字符有关,则可以使用两个函数:
length() - 在 CHARACTERS 中查找字符串的长度 octet_length() - 以 BYTES 计算字符串的长度如果您仍然无法找到问题,您可能需要发布您正在使用的 DDL 和 SQL,以便获得更具体的建议。
【讨论】:
谢谢比尔。让我进一步了解基本查询。会尽快回复您。 @bill 只是好奇,在红移中,数据类型部分具有数据的大小(例如:name varchar(10) - name column can hold up to 10 bytes
)那么如何插入超过1 bytes
(根据问题) 及其在选择数据时给出的错误?
一个 VARCHAR(10) 最多可以容纳 10 个 ascii 字符,但更少的字符是多字节的。一个非 ascii 字符可能需要 2、3 或 4 个字节来存储。单个字符不可能填充 varchar(10) 但 3 可能可以。 (2 字节字符相当常见,但 4 字节字符很少见。)这些信息有帮助吗?
感谢@BillWeiner 的正确轨道。你是对的。以上是关于AWS Redshift 查询过长异常的主要内容,如果未能解决你的问题,请参考以下文章
我可以使用 AWS Glue 将 S3 上的 json 数据转换为列格式并将其推送到 Redshift 吗?