使用 JSONPaths 文件错误的 Kinesis 到 Redshift COPY 命令
Kinesis to Redshift COPY Command using JSONPaths File Error
我正在尝试将 API 调用的记录发送到 S3,然后仅将特定字段进行红移。例如,我的程序成功发送以下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" 字段可能包含一条记录,如上例,如果查询 returns 多个结果,则可能包含多条记录。我只想将数据中的信息复制到具有相同列名的 redshift 上的 "Employee" table 中。使用 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",
]
}
这是我的程序的一个例子 运行:
- 运行 我在 Tomcat 服务器上的 AWS Java Web 项目
- 输入 http://localhost:000/projectname/rest/employee/1(从我的 MS SQL 服务器数据库成功 returns 一个员工 ID 1 的 json 对象)
- 使用有关调用和查询结果的元数据在此 post 的顶部创建 json 对象
- 成功将此对象写入's3://bucket/prefix/'
- 尝试 运行 复制命令但失败。当我转到我的 redshift 集群的加载选项卡以获取有关加载失败原因的更多信息时,命令的状态已终止并且 SQL 字段显示 "COPY ANALYZE employee"
当我尝试运行下面复制命令的手动版本时,出现以下错误:"ERROR: XX000: Manifest file is not in correct json format"
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 文件格式是否正确?
-这是从 JSON 数组的较低级别提取的最佳方法吗?
-我的清单文件格式是否正确?为什么需要清单文件?
注意:在我添加元数据之前,我仅使用我想要加载的字段测试了 s3 到 redshift 连接并且它加载成功,所以我的 redshift 目标不太可能配置不正确。
感谢您的帮助!
根据我的记忆,当您尝试加载 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 格式或要使用的 JSON 路径。所以,默认情况下,
the COPY command expects the source data to be in character-delimited
UTF-8 text files. The default delimiter is a pipe character ( | ).
我正在尝试将 API 调用的记录发送到 S3,然后仅将特定字段进行红移。例如,我的程序成功发送以下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" 字段可能包含一条记录,如上例,如果查询 returns 多个结果,则可能包含多条记录。我只想将数据中的信息复制到具有相同列名的 redshift 上的 "Employee" table 中。使用 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",
]
}
这是我的程序的一个例子 运行:
- 运行 我在 Tomcat 服务器上的 AWS Java Web 项目
- 输入 http://localhost:000/projectname/rest/employee/1(从我的 MS SQL 服务器数据库成功 returns 一个员工 ID 1 的 json 对象)
- 使用有关调用和查询结果的元数据在此 post 的顶部创建 json 对象
- 成功将此对象写入's3://bucket/prefix/'
- 尝试 运行 复制命令但失败。当我转到我的 redshift 集群的加载选项卡以获取有关加载失败原因的更多信息时,命令的状态已终止并且 SQL 字段显示 "COPY ANALYZE employee"
当我尝试运行下面复制命令的手动版本时,出现以下错误:"ERROR: XX000: Manifest file is not in correct json format"
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 文件格式是否正确?
-这是从 JSON 数组的较低级别提取的最佳方法吗?
-我的清单文件格式是否正确?为什么需要清单文件?
注意:在我添加元数据之前,我仅使用我想要加载的字段测试了 s3 到 redshift 连接并且它加载成功,所以我的 redshift 目标不太可能配置不正确。
感谢您的帮助!
根据我的记忆,当您尝试加载 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 格式或要使用的 JSON 路径。所以,默认情况下,
the COPY command expects the source data to be in character-delimited UTF-8 text files. The default delimiter is a pipe character ( | ).