【问题标题】:Kinesis to Redshift COPY Command using JSONPaths File ErrorKinesis to Redshift COPY 命令使用 JSONPaths 文件错误
【发布时间】:2016-07-11 06:03:57
【问题描述】:

我正在尝试将 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"
}]

}

如果查询返回多个结果,“数据”字段可能包含一条记录(如上例)或多条记录。我只想将数据中的信息复制到具有相同列名的红移上的“员工”表中。使用 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 员工”
  6. 当我尝试运行以下复制命令的手动版本时,我收到以下错误:“错误:XX000:清单文件不是正确的 json 格式”

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

为了解决清单问题,我创建了以下文件:

{

  "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: "Delimiter not found",其中原始字段值作为保存到 s3 的完整 json 文件。如果我从上一个复制命令中添加 jsonPaths 文件行,我会得到与以前相同的清单错误。

问题:

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

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

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

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

感谢您的帮助!

【问题讨论】:

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


    【解决方案1】:

    据我记得,当您尝试加载 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 文本文件。默认分隔符是竖线字符 (|)。

    【讨论】:

    • 非常感谢!不敢相信我错过了。用 Kinesis 发出的自动复制命令仍然不起作用,但手动复制命令至少有效。
    • 你错过了哪一部分?最后一个逗号或表示法更改为数组表示法(与点表示法相比)?
    • @ketan vijayvargiya,您将如何使用括号表示法处理所有对象?
    猜你喜欢
    • 1970-01-01
    • 2016-06-30
    • 2016-06-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-01
    • 1970-01-01
    相关资源
    最近更新 更多