使用JSONPaths文件错误的Kinesis到Redshift COPY命令

时间:2016-03-23 19:12:45

标签: amazon-web-services amazon-redshift jsonpath amazon-kinesis

我正在尝试将API调用的记录发送到S3,然后只将特定字段发送到redshift。例如,我的程序成功将以下JSON发送到S3:

{

"user": "user_name",
"type": "GET",
"date": "2016-03-22 16:14:13",
"data": [{
    "EmpID": 1,
    "LastName": "Smith",
    "FirstName": "Bob",
    "DOB": "1910-01-01",
    "SSN": "123456789",
    "HireDate": "1910-01-01",
    "City": "Town",
    "Address": "123 Abc"
}]

}

“data”字段可能包含一条记录(如上例)或许多记录(如果查询返回多个结果)。我想只将数据中的信息复制到redshift上具有相同列名的“Employee”表中。使用json'auto'复制不起作用,因为它只解析顶级字段。为了解决这个问题,我创建了以下JSON路径文件:

{

"jsonpaths": [
    "$.data[0].EmpID",
    "$.data[0].LastName",
    "$.data[0].FirstName",
    "$.data[0].DOB",
    "$.data[0].SSN",
    "$.data[0].HireDate",
    "$.data[0].City",
    "$.data[0].Address",
]

}

以下是我的程序示例:

  1. 在Tomcat服务器上运行我的AWS Java Web项目
  2. 输入http://localhost:000/projectname/rest/employee/1(从我的MS SQL服务器数据库成功返回员工ID 1的json对象)
  3. 使用有关调用和查询结果的元数据创建此帖子顶部的json对象
  4. 将此对象成功写入's3:// bucket / prefix /'
  5. 尝试运行复制命令并失败。当我转到我的redshift集群的加载选项卡以获取有关加载失败原因的更多信息时,命令的状态将终​​止,并且SQL字段显示“COPY ANALYZE employee”
  6. 当我尝试运行下面的复制命令的手动版本时,我收到以下错误:“错误:XX000:清单文件格式不正确”

    COPY employee
    FROM 's3://bucket/prefix/filename'
    CREDENTIALS 'aws_access_key_id=<>;aws_secret_access_key=<>'
    JSON 's3://bucket/jsonpaths.json';
    
  7. 为了解决清单问题,我创建了以下文件:

    {
    
      "entries": [
        {"url":"s3://bucket/prefix/file", "mandatory":true}
      ]
    
    }
    

    然后运行复制命令:

        COPY employee
        FROM 's3://bucket/manifest.json'
        CREDENTIALS'aws_access_key_id=<>;aws_secret_access_key=<>' 
        MANIFEST
    

    这会产生stl_load_error:“未找到分隔符”,原始字段值为保存到s3的完整json文件。如果我从前一个复制命令添加jsonPaths文件行,我会得到与以前相同的清单错误。

    问题:

    - 我的JSONPaths文件格式是否正确?

    - 这是从较低级别的JSONArray中提取的最佳方法吗?

    - 我的清单文件的格式是否正确?为什么需要清单文件?

    注意:在添加元数据之前,我测试了s3到redshift连接只有我想加载的字段并且加载成功,所以我的redshift目标不太可能配置不正确。

    感谢您的帮助!

1 个答案:

答案 0 :(得分:2)

根据我的记忆,当您尝试加载JSON数据并且您的JSONPaths文件存在语法错误时,Redshift会抛出您的清单文件格式错误(错误且误导性)的异常。因此,如果您的JSONPaths文件中没有语法错误,我很确定以下命令可以正常工作:

COPY employee
FROM 's3://bucket/prefix/filename'
CREDENTIALS 'aws_access_key_id=<>;aws_secret_access_key=<>'
JSON 's3://bucket/jsonpaths.json';

现在,您的JSONPaths文件出了什么问题?对我来说,它看起来很好,但我可以建议你应该尝试几件事:

  • 删除最后一个条目中的逗号,即将"$.data[0].Address",更改为"$.data[0].Address"
  • 如果上述方法无效,请尝试不使用点表示法。例如,将"$.data[0].EmpID"更改为"$['data'][0]['EmpID']"

P.S.-这是完全错误的:

COPY employee
FROM 's3://bucket/manifest.json'
CREDENTIALS'aws_access_key_id=<>;aws_secret_access_key=<>' 
MANIFEST

这是因为您告诉Redshift使用清单文件,但不是输入数据是JSON格式或要使用的JSONPaths。所以,默认情况下,

  

COPY命令期望源数据以字符分隔   UTF-8文本文件。默认分隔符是管道符(|)。