Amazon redshift 使用JSONPath对缺少的数组/字段进行红移复制

Amazon redshift 使用JSONPath对缺少的数组/字段进行红移复制,amazon-redshift,jsonpath,Amazon Redshift,Jsonpath,我使用COPY命令将JSON数据集从S3加载到红移表。数据正在部分加载,但它会忽略缺少数据(键值/数组)的记录,即从下面的示例中,只有第一条记录将被加载 查询: 从“s3://mybucket/address.json”复制地址 凭证“aws\u访问\u密钥\u id=XXXXXXX;aws_secret_access_key=XXXXXXX' 最大错误为250 json's3:/mybucket/address_jsonpath.json' 我的问题是如何从address.json加载所有记录

我使用COPY命令将JSON数据集从S3加载到红移表。数据正在部分加载,但它会忽略缺少数据(键值/数组)的记录,即从下面的示例中,只有第一条记录将被加载

查询:

从“s3://mybucket/address.json”复制地址
凭证“aws\u访问\u密钥\u id=XXXXXXX;aws_secret_access_key=XXXXXXX' 最大错误为250
json's3:/mybucket/address_jsonpath.json'

我的问题是如何从address.json加载所有记录,即使某些记录缺少键/数据,类似于下面的示例数据集

JSON示例

{
  "name": "Sam P",
  "addresses": [
    {
      "zip": "12345",
      "city": "Silver Spring",
      "street_address": "2960 Silver Ave",
      "state": "MD"
    },
    {
      "zip": "99999",
      "city": "Curry",
      "street_address": "2960 Silver Ave",
      "state": "PA"
    }
  ]
}
{
  "name": "Sam Q",
  "addresses": [ ]
}
{
  "name": "Sam R"
}
是否有替代JSON数据集的方法


我正在寻找一个实现或解决方法,可以加载红移表中的所有上述3条记录。

对于从JSON复制,没有类似的
FILLRECORD

但是您有一个更基本的问题-第一条记录包含多个
地址的数组。红移的JSON副本不允许您从嵌套数组创建多行

解决这一问题的最简单方法是使用我们的方法将嵌入式数组扩展为整行。然后使用插入到
中的
将数据加载到最终的表中

DROP TABLE IF EXISTS spectrum.partial_json;
CREATE EXTERNAL TABLE spectrum.partial_json (
  name       VARCHAR(100),
  addresses  ARRAY<STRUCT<zip:INTEGER
                         ,city:VARCHAR(100)
                         ,street_address:VARCHAR(255)
                         ,state:VARCHAR(2)>>
)
ROW FORMAT SERDE 'org.openx.data.jsonserde.JsonSerDe'
LOCATION 's3://my-test-files/partial_json/'
;

INSERT INTO final_table 
SELECT ext.name
     , address.zip
     , address.city
     , address.street_address
     , address.state
FROM spectrum.partial_json ext
LEFT JOIN ext.addresses address ON true
;
--  name  |  zip  |     city      | street_address  | state
-- -------+-------+---------------+-----------------+-------
--  Sam P | 12345 | Silver Spring | 2960 Silver Ave | MD
--  Sam P | 99999 | Curry         | 2960 Silver Ave | PA
--  Sam Q |       |               |                 |
--  Sam R |       |               |                 |
如果存在spectrum.partial\u json,则删除表;
创建外部表spectrum.partial_json(
名称VARCHAR(100),
地址数组
)
行格式SERDE'org.openx.data.jsonserde.jsonserde'
位置“s3://my test files/partial_json/”
;
插入最终表格
选择ext.name
,address.zip
,地址:城市
,address.street\u地址
,address.state
从spectrum.partial_json ext
左连接外部地址为true
;
--名称|邮编|城市|街道|地址|州
-- -------+-------+---------------+-----------------+-------
--Sam P | 12345 |银泉|马里兰州银大道2960号
--Sam P | 99999 | Curry | 2960宾夕法尼亚州银大道
--山姆·Q | | ||
--山姆·R | | ||

注意:我对您的示例JSON做了一些调整,使其更简单。例如,您将未设置关键帧的对象作为
name
的值,我将其转换为纯字符串值。

如何

{
  "name": "Sam R"
  "address": ""
}

您的
地址\u jsonpath.json
文件内容在这里非常重要,可以提供答案。@RedBoy包含了jsonpath文件。我对您的示例json进行了一些调整,使其更简单。例如,您将未设置关键帧的对象作为名称的值,我将其转换为纯字符串值。不建议使用纯代码答案。请解释您的答案为何以及如何解决问题。