我正在尝试将数据从 DynamoDB 表加载到 Redshift 中。该表包含无法正确获取的嵌套字段。 DynamoDB 内的数据具有如下结构
"Status": {
"S": "queued"
},
"optional": {
"M": {
"file_size": {
"N": "1.884"
},
"records_count": {
"N": "1276"
},
"submission_timestamp": {
"N": "1716764400"
}
}
},
}
在 Redshift 中我尝试了两种解决方案,一种是创建一个类似的表
CREATE TABLE my_redshift_table (
status VARCHAR(50)
optional_file_size DECIMAL(10,4),
optional_records_count BIGINT,
optional_submission_timestamp BIGINT,
);
但是列中的数据为 NULL
另一个选项是尝试像这样超级可选
CREATE TABLE my_redshift_table (
status VARCHAR(50)
optional SUPER,
);
但根据我的理解,数据类型 SUPER 无效,因为它会引发错误,并且阅读文档时支持的类型是 STRING 或 NUMBER。
有什么好的方法来处理嵌套字段吗?我不想通过展平数据并存储在 S3 中来执行 ETL 过程,需要直接从 DynamoDB 查询或加载到 Redshift。
使用数据类型 SUPER 时出现错误消息
ERROR: Unsupported Data Type: Current Version only supports Strings and Numbers Detail: ----------------------------------------------- error: Unsupported Data Type: Current Version only supports Strings and Numbers code: 9005 context: Table Name = ddp-dev-euwest1-bookkeeper-v2 query: 6301675[child_sequence:1] location: copy_dynamodb_scanner.cpp:182 process: query0_4084_6301676 [pid=27935] ----------------------------------------------- [ErrorId: 1-6737121e-20350b656e58fdf1669a5df6]
您可以按如下方式创建目标表:
CREATE TABLE my_redshift_table (
status VARCHAR(50),
optional VARCHAR(MAX)
);
然后查询:
SELECT
status,
json_extract_path_text(optional, 'file_size')::DECIMAL(10, 4) AS optional_file_size,
json_extract_path_text(optional, 'records_count')::BIGINT AS optional_records_count,
json_extract_path_text(optional, 'submission_timestamp')::BIGINT AS optional_submission_timestamp
FROM my_redshift_table;
在 Redshift 中,VARCHAR(MAX) 数据类型为 65535