无法复制json-Dynamo db Streams进行redshift

时间:2018-08-29 07:30:34

标签: amazon-s3 amazon-dynamodb amazon-redshift amazon-kinesis-firehose amazon-dynamodb-streams

以下是我正在研究的用例: 在使用enable Streams创建DynamoDB时,我已经配置了new and old Image。我已经创建了一个Kinesis Firehose delivery stream,目的地为RedshiftIntermediate s3)。

从Dynamodb,我的流以下面给出的JSON(S3 Bucket -Gzip)的形式到达Firhose,并从那里到达Bucket。我的问题是我cannot COPY this JSON to redshift

我无法得到的东西:

    1. 不确定Redshift中的Create table语句应该是什么
    1. Kinesis笛卡尔中的COPY语法应该是什么。
    1. 我应该如何在这里使用JsonPaths。 Kinesis Data Firehouse设置为仅将json返回到我的s3存储桶。
    1. 如何在COPY命令中提及Maniphest

JSON加载到S3如下所示:

{
    "Keys": {
        "vehicle_id": {
            "S": "x011"
        }
    },
    "NewImage": {
        "heart_beat": {
            "N": "0"
        },
        "cdc_id": {
            "N": "456"
        },
        "latitude": {
            "N": "1.30951"
        },
        "not_deployed_counter": {
            "N": "1"
        },
        "reg_ind": {
            "N": "0"
        },
        "operator": {
            "S": "x"
        },
        "d_dttm": {
            "S": "11/08/2018 2:43:46 PM"
        },
        "z_id": {
            "N": "1267"
        },
        "last_end_trip_dttm": {
            "S": "11/08/2018 1:43:46 PM"
        },
        "land_ind": {
            "N": "1"
        },
        "s_ind": {
            "N": "1"
        },
        "status_change_dttm": {
            "S": "11/08/2018 2:43:46 PM"
        },
        "case_ind": {
            "N": "1"
        },
        "last_po_change_dttm": {
            "S": "11/08/2018 2:43:46 PM"
        },
        "violated_duration": {
            "N": "20"
        },
        "vehicle_id": {
            "S": "x011"
        },
        "longitude": {
            "N": "103.7818"
        },
        "file_status": {
            "S": "Trip_Start"
        },
        "unhired_duration": {
            "N": "10"
        },
        "eo_lat": {
            "N": "1.2345"
        },
        "reply_eo_ind": {
            "N": "1"
        },
        "license_ind": {
            "N": "0"
        },
        "indiscriminately_parked_ind": {
            "N": "0"
        },
        "eo_lng": {
            "N": "102.8978"
        },
        "officer_id": {
            "S": "xxxx@gmail.com"
        },
        "case_status": {
            "N": "0"
        },
        "color_status_cd": {
            "N": "0"
        },
        "parking_id": {
            "N": "2345"
        },
        "ttr_dttm": {
            "S": "11/08/2018 2:43:46 PM"
        },
        "deployed_ind": {
            "N": "1"
        },
        "status": {
            "S": "PI"
        }
    },
    "SequenceNumber": "1200000000000956615967",
    "SizeBytes": 570,
    "ApproximateCreationDateTime": 1535513040,
    "eventName": "INSERT"
}

我的创建表语句:

create table vehicle_status(
    heart_beat integer,
    cdc_id integer,
    latitude integer,   
    not_deployed_counter integer,
    reg_ind integer,
    operator varchar(10),
    d_dttm varchar(30),
    z_id integer,
    last_end_trip_dttm varchar(30),
    land_ind integer,
    s_ind integer,
    status_change_dttm varchar(30), 
    case_ind integer,
    last_po_change_dttm varchar(30),    
    violated_duration integer,
    vehicle_id varchar(8),
    longitude integer,  
    file_status varchar(30),
    unhired_duration integer,
    eo_lat integer,                     
    reply_eo_ind integer,
    license_ind integer,    
    indiscriminately_parked_ind integer,
    eo_lng integer,
    officer_id varchar(50),
    case_status integer,
    color_status_cd integer,
    parking_id integer,
    ttr_dttm varchar(30),
    deployed_ind varchar(3),
  status varchar(8));

“我的复制”语句(手动尝试从Redshift重新修改):

COPY vehicle_status (heart_beat, cdc_id, latitude, not_deployed_counter, reg_ind, operator, d_dttm, z_id, last_end_trip_dttm, land_ind, s_ind, status_change_dttm, case_ind, last_po_change_dttm, violated_duration, vehicle_id, longitude, file_status, unhired_duration, eo_lat, reply_eo_ind, license_ind, indiscriminately_parked_ind, eo_lng, officer_id, case_status, color_status_cd, parking_id, ttr_dttm, deployed_ind, status) 
FROM 's3://<my-bucket>/2018/08/29/05/vehicle_status_change-2-2018-08-29-05-24-42-092c330b-e14a-4133-bf4a-5982f2e1f49e.gz' CREDENTIALS 'aws_iam_role=arn:aws:iam::<accountnum>:role/<RedshiftRole>' GZIP json 'auto';

当我尝试上述过程时-我插入了记录-但所有列和行均为空。

如何将这种json格式复制到redhsift。最近三天被卡在这里。对此的任何帮助都可以。

S3存储桶:

Amazon S3/<My-bucket>/2018/08/29/05
Amazon S3/<My-bucket>/manifests/2018/08/29/05

1 个答案:

答案 0 :(得分:1)

我对亚马逊不是很熟悉,但是让我尝试回答您的大多数问题,以便您继续前进。欢迎其他人编辑此答案或其他详细信息。谢谢!

  

不确定Redshift中的Create table语句应该是什么

您的创建语句create table vehicle_status(...)没问题,尽管您可以根据需要添加distribution keysort keyencoding,但请参考更多here和{ {3}}

根据AWS Kenesis here,您的表必须存在于Redshift中,因此您可以使用Redshift命令连接到psql并运行create statement手动。

  

Kinesis firhose中的COPY语法应该是什么。

通过Copypsql运行firhose语法将保持不变,幸运的是,您提出的复制脚本可以正常工作,我在实例中进行了尝试只需对直接AWS/SECRET密钥提供进行少量修改,然后工作就可以了,在这里,我运行的sql运行得很好,并将1个数据记录复制到表vehicle_status中。

实际上,您的json路径结构很复杂,因此json 'auto'将不起作用。这是工作命令,我为您创建了一个示例jsonpath文件,其中包含4个示例字段,您可以按照相同的结构来创建包含所有数据点的jsonpath文件。

 COPY vehicle_status (heart_beat, cdc_id, operator, status) FROM 's3://XXX/development/test_file.json' CREDENTIALS 'aws_access_key_id=XXXXXXXXXXXXXXXXX;aws_secret_access_key=MYXXXXXXXXXXXXXXXXXXXXXX' json 's3://XXX/development/yourjsonpathfile';

您的json path file的内容应类似于以下内容。

{
  "jsonpaths": [
    "$['NewImage']['heart_beat']['N']",
    "$['NewImage']['cdc_id']['N']",
    "$['NewImage']['operator']['S']",
    "$['NewImage']['status']['S']"
  ]
}

我已经对其进行了测试,并且可以正常工作。

  

我应该如何在这里使用JsonPaths。 Kinesis Data Firehouse设置为仅将json返回到我的s3存储桶。

我仅使用了您的示例json数据,它可以正常工作,因此在这里我看不到任何问题。

  

如何在COPY命令中提及Maniphest

这是一个好问题,我可以尝试解释一下,希望您在这里指的是menifest

如果您看到上面的复制命令,则它对于一个文件或几个文件可以正常工作,但是认为您有很多文件,这里是menifest的概念。 直接来自Amazon docs,“您没有提供COPY命令的对象路径,而是提供了一个JSON格式的文本文件的名称,该文件明确列出了要加载的文件。”

简而言之,如果您想一次加载多个文件(Redshift也是首选方式),则可以使用json创建一个简单的menifest并在copy命令中提供相同的文件。 / p>

{ "entries": [ {"url":"s3://mybucket-alpha/2013-10-04-custdata", "mandatory":true}, {"url":"s3://mybucket-alpha/2013-10-05-custdata", "mandatory":true},.... ] }

将清单上载到S3,并在如下所示的复制命令中使用。

 COPY vehicle_status (heart_beat, cdc_id, latitude, not_deployed_counter, reg_ind, operator, d_dttm, z_id, last_end_trip_dttm, land_ind, s_ind, status_change_dttm, case_ind, last_po_change_dttm, violated_duration, vehicle_id, longitude, file_status, unhired_duration, eo_lat, reply_eo_ind, license_ind, indiscriminately_parked_ind, eo_lng, officer_id, case_status, color_status_cd, parking_id, ttr_dttm, deployed_ind, status) FROM 's3://XXX/development/test.menifest' CREDENTIALS 'aws_access_key_id=XXXXXXXXXXXXXXXXX;aws_secret_access_key=MYXXXXXXXXXXXXXXXXXXXXXX' json 's3://yourbucket/jsonpath' menifest;

这里是documents的详细参考。

我希望这会给您一些想法,如何继续进行下去,如果您看到明显的错误,我很乐意重新关注答案。