将JSON数据加载到AWS Redshift会导致NULL值

sha*_*ane 11 amazon-web-services amazon-redshift

我正在尝试执行加载/复制操作,以将数据从S3存储桶中的JSON文件直接导入Redshift.COPY操作成功,在COPY之后,表具有正确的行/记录数,但每个记录都为NULL!

它需要加载的预期时间,COPY命令返回OK,Redshift控制台报告成功且没有错误......但是如果我从表中执行简单查询,它只返回NULL值.

JSON非常简单+平面,并且格式正确(根据我在这里找到的示例:http://docs.aws.amazon.com/redshift/latest/dg/r_COPY_command_examples.html)

基本上,它是每行一行,格式如下:

{ "col1": "val1", "col2": "val2", ... }
{ "col1": "val1", "col2": "val2", ... }
{ "col1": "val1", "col2": "val2", ... }
Run Code Online (Sandbox Code Playgroud)

我尝试过根据JSON对象中的值和数据类型重写模式,以及从未压缩文件复制.我想也许JSON在加载时没有被正确解析,但如果无法解析对象,它可能会引发错误.

我的COPY命令如下所示:

copy events from 's3://mybucket/json/prefix' 
with credentials 'aws_access_key_id=xxx;aws_secret_access_key=xxx'
json 'auto' gzip;
Run Code Online (Sandbox Code Playgroud)

任何指导将不胜感激!谢谢.

sha*_*ane 24

所以我发现了原因 - 这在我原来的帖子中提供的描述中并不明显.

在Redshift中创建表时,列名称将转换为小写.执行COPY操作时,列名称区分大小写.

我一直在尝试加载的输入数据是使用camelCase作为列名,因此当我执行COPY时,列与定义的模式(现在使用所有小写列名称)不匹配

但是,该操作不会引发错误.它只是在所有不匹配的列中留下NULL(在这种情况下,所有列都是)

希望这有助于某人避免同样的困惑!

  • 我也可以确认情况确实如此。亚马逊在他们的文档中根本没有提到案例和 Redshift“自动”副本的巨大遗漏,真是太可惜了。本质上,如果您的 JSON 属性名称使用小写字符以外的任何字符,则必须使用 JSONPaths 文件! (2认同)