以下是我正在研究的用例:
在使用enable Streams
创建DynamoDB
时,我已经配置了new and old Image
。我已经创建了一个Kinesis Firehose delivery stream
,目的地为Redshift
(Intermediate s3
)。
从Dynamodb,我的流以下面给出的JSON(S3 Bucket -Gzip)的形式到达Firhose,并从那里到达Bucket。我的问题是我cannot COPY this JSON to redshift
。
我无法得到的东西:
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
答案 0 :(得分:1)
我对亚马逊不是很熟悉,但是让我尝试回答您的大多数问题,以便您继续前进。欢迎其他人编辑此答案或其他详细信息。谢谢!
不确定Redshift中的Create table语句应该是什么
您的创建语句create table vehicle_status(...)
没问题,尽管您可以根据需要添加distribution key
,sort key
和encoding
,但请参考更多here和{ {3}}
根据AWS Kenesis here,您的表必须存在于Redshift
中,因此您可以使用Redshift
命令连接到psql
并运行create statement
手动。
Kinesis firhose中的COPY语法应该是什么。
通过Copy
或psql
运行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的详细参考。
我希望这会给您一些想法,如何继续进行下去,如果您看到明显的错误,我很乐意重新关注答案。