Redshift动态JSON导入:能否用JSONPaths文件免预处理?
没问题!你完全不需要预处理JSON文件,也不用依赖JSONPaths文件——Redshift本身就有能力处理这种动态子对象的导入需求,具体做法如下:
步骤1:创建临时表存储原始JSON数据
先建一个带SUPER类型列的临时表,用来接收整个JSON对象(SUPER类型是Redshift专门用来存储半结构化数据的,非常适合这种动态结构的JSON):
CREATE TEMP TABLE raw_player_import ( player SUPER );
步骤2:用COPY命令导入JSON文件
使用JSON 'auto'模式把S3上的JSON文件导入到临时表,它会自动识别顶级的player对象并存储到SUPER列里:
COPY raw_player_import FROM 's3://your-bucket/player-data/' IAM_ROLE 'arn:aws:iam::your-account-id:role/your-redshift-copy-role' JSON 'auto';
步骤3:动态展开子对象为目标行
利用Redshift的json_object_keys函数获取player下的所有球员名字(也就是那些动态变化的键),再通过交叉连接和json_extract_path_text提取对应的position,自动生成你需要的每行一条球员记录的结构:
SELECT key AS name, json_extract_path_text(player, key, 'position') AS position FROM raw_player_import, json_object_keys(player) AS key;
为什么这种方案可行?
- JSONPaths文件只适合固定结构的JSON,用来把特定JSON字段映射到表列,但你的场景里
player的子对象键是动态变化的,JSONPaths没法处理这种动态展开的需求。 - 而Redshift的SUPER类型+内置JSON函数天生支持半结构化数据的动态解析,不管
player下有1个还是N个子对象,每次导入后都能自动展开所有球员记录。
可选:持久化到正式表
如果需要把结果存到正式业务表,直接把上面的查询改成INSERT语句就行:
INSERT INTO player_stats (name, position) SELECT key AS name, json_extract_path_text(player, key, 'position') AS position FROM raw_player_import, json_object_keys(player) AS key;
内容的提问来源于stack exchange,提问作者pippa dupree
相关产品推荐
相关产品推荐

