我正在使用Kinesis firehose通过S3将数据传输到Redshift。 我有一个非常简单的csv文件,看起来像这样。 firehose将它放到s3但Redshift错误输出Delimiter未找到错误。 我已经查看了与此错误相关的所有帖子,但我确保包含分隔符。
文件
GOOG,2017-03-16T16:00:01Z,2017-03-17 06:23:56.986397,848.78
GOOG,2017-03-16T16:00:01Z,2017-03-17 06:24:02.061263,848.78
GOOG,2017-03-16T16:00:01Z,2017-03-17 06:24:07.143044,848.78
GOOG,2017-03-16T16:00:01Z,2017-03-17 06:24:12.217930,848.78
OR
"GOOG","2017-03-17T16:00:02Z","2017-03-18 05:48:59.993260","852.12"
"GOOG","2017-03-17T16:00:02Z","2017-03-18 05:49:07.034945","852.12"
"GOOG","2017-03-17T16:00:02Z","2017-03-18 05:49:12.306484","852.12"
"GOOG","2017-03-17T16:00:02Z","2017-03-18 05:49:18.020833","852.12"
"GOOG","2017-03-17T16:00:02Z","2017-03-18 05:49:24.203464","852.12"
红移表
CREATE TABLE stockvalue
( symbol VARCHAR(4),
streamdate VARCHAR(20),
writedate VARCHAR(26),
stockprice VARCHAR(6)
);
有人可以指出文件可能出错的地方。 我在字段之间添加了一个逗号。 目标表中的所有列都是varchar,因此不应该有数据类型错误的原因。 此外,列长度与文件和redshift表之间完全匹配。 我已经尝试在双引号中嵌入列而没有。
答案 0 :(得分:5)
你可以发布完整的COPY命令吗?它在屏幕截图中被截断了。
我的猜测是你在COPY命令中缺少DELIMITER ','
。尝试将其添加到COPY命令。
答案 1 :(得分:0)
1-您需要添加FORMAT AS JSON's3://yourbucketname/aJsonPathFile.txt'。 AWS尚未提到这一点。请注意,这仅在您的数据采用JSON格式(如
)时有效{'attr1':'val1','attr2':'val2'} {'attr1':'val1','attr2':'val2'} {'attr1':'val1','attr2': 'val2'} {'attr1:'val1','attr2':'val2'}
2-您还需要验证kinesis firehouse和csv文件中的列顺序,然后尝试添加
TRUNCATECOLUMNS blanksasnull emptyasnull
3-一个例子
COPY testrbl3(eventId,serverTime,pageName,action,ip,userAgent,位置,平台,语言,广告系列,内容,源,媒体,productID,colorCode,scrolltoppercentage)来自's3:// bucketname /'CREDENTIALS'aws_iam_role = arn:aws:iam ::: role /'清单json'自动'TRUNCATECOLUMNS blanksasnull emptyasnull;
答案 2 :(得分:0)
我在这个问题上坚持了几个小时,感谢Shahid的回答,它帮助我解决了这个问题。
要添加的重要说明-列名的文本大小写很重要。
Redshift始终会将您的表字段设置为小写,因此映射到列的JSON字段(请确保键是小写),
例如
JSON文件会看起来像:
{'id':'val1','name':'val2'} {'id':'val1','name':'val2'} {'id':'val1','name': 'val2'} {'id':'val1','name':'val2'}
复制声明会看起来像:
从's3:///'CREDENTIALS'aws_iam_role = arn:aws:iam ::: role /'清单json'自动'; COPY延迟(id,name);
Firehose中的设置必须具有指定的列名(小写),并将以下内容添加到COPY选项:
json'auto'TRUNCATECOLUMNS blanksasnull emptyasnull
在PYTHON中使用put_records:
以下是显示如何在python中通过kinesis使用put_records函数的代码段:
传递给'put_to_stream'函数的'objects'是一个字典数组:
def put_to_stream(objects): 记录= []
for metric in metrics:
record = {
'Data': json.dumps(metric),
'PartitionKey': 'swat_report'
};
records.append(record)
print(records)
put_response = kinesis_client.put_records(StreamName=kinesis_stream_name, Records=records)
冲洗