未找到分隔符错误 - 使用Kinesis Firehose从s3加载AWS Redshift

时间:2017-03-18 21:58:11

标签: amazon-web-services amazon-s3 amazon-redshift amazon-kinesis-firehose

我正在使用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)
);
  • 错误 Error

  • 以防万一,这是我的kinesis流的样子 Firehose

有人可以指出文件可能出错的地方。 我在字段之间添加了一个逗号。 目标表中的所有列都是varchar,因此不应该有数据类型错误的原因。 此外,列长度与文件和redshift表之间完全匹配。 我已经尝试在双引号中嵌入列而没有。

3 个答案:

答案 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)

冲洗