从S3加载嵌套JSON到Redshift:COPY命令能否直接映射字段?
问题描述
我有如下嵌套JSON结构:
{ "id":"1", "event":{ "eventid":"event-qcTUrDAThkbPsXi438rRk", "eventtype": 1 } }
我需要将这类文档映射至包含id、eventid、eventtype三个字段的Redshift表中。请问是否可以使用如下COPY命令来指定映射:
COPY raw_data from 's3://foo/bar.json' with credentials as '' format as json 'auto';
还是必须手动将JSON文档转换为扁平结构?
回答
直接用json 'auto'不行,Redshift的auto模式只会匹配顶层字段,嵌套在event里的eventid和eventtype会被忽略,导入后这两个字段的值会是NULL。
不需要手动转换JSON结构,你可以用Redshift支持的JSON路径表达式来指定映射,修改COPY命令即可:
方式1:使用外部JSON路径文件
COPY raw_data from 's3://foo/bar.json' with credentials as '' format as json 's3://foo/jsonpaths.json';
其中s3://foo/jsonpaths.json是存储路径映射文件的S3地址,文件内容如下:
{ "jsonpaths": [ "$.id", "$.event.eventid", "$.event.eventtype" ] }
这个路径文件会告诉COPY命令分别从JSON的对应位置提取字段值,直接导入到Redshift表的三个字段中。
方式2:使用内联JSON路径
也可以直接在COPY命令里写路径,不用单独存文件:
COPY raw_data from 's3://foo/bar.json' with credentials as '' format as json '{ "jsonpaths": [ "$.id", "$.event.eventid", "$.event.eventtype" ] }';
这两种方式都能直接导入嵌套JSON的指定字段,无需提前扁平化结构。
内容的提问来源于stack exchange,提问作者pacman
相关产品推荐
相关产品推荐

