如何通过Kinesis将数据从Lambda(Python)发送到Redshift
我在Python中有一个lambda函数,它生成一些东西并返回一些需要在红移中插入的值。在lambda中,我将值推送到Kinesis,后者在S3中复制它们,然后在Redshift中复制它们 lambda中的值以字符串形式获得,如下所示:如何通过Kinesis将数据从Lambda(Python)发送到Redshift,python,amazon-web-services,amazon-s3,aws-lambda,amazon-redshift,Python,Amazon Web Services,Amazon S3,Aws Lambda,Amazon Redshift,我在Python中有一个lambda函数,它生成一些东西并返回一些需要在红移中插入的值。在lambda中,我将值推送到Kinesis,后者在S3中复制它们,然后在Redshift中复制它们 lambda中的值以字符串形式获得,如下所示: final_string = 'a;b;d;c' 每个字母都是表中不同列的红移值,因此delimeter为“;”。然后,我使用以下命令将数据推送到Kinesis流: put_response = kinesis_client.put_record(Stream
final_string = 'a;b;d;c'
每个字母都是表中不同列的红移值,因此delimeter为“;”。然后,我使用以下命令将数据推送到Kinesis流:
put_response = kinesis_client.put_record(StreamName = 'PixelTrack',
Data=json.dumps(final_string),
PartitionKey='first')
然后,动力流供给动力消防软管流。使用Kinesis Firehose在S3中生成的文件如下(包括文件中的引号):
最后,我使用以下语句(在Kinesis firehose中配置)将数据复制到红移:
我已经设法让它工作起来,并在只有一个结果在Kinesis中缓冲时在Redshift中获取值(不过,在Redshift中创建了一个新列)。因此,当在缓冲时间内仅执行一个lambda时,红移表如下所示:
A B C D no_info_column
"a b c d" <null>
由于copy语句找不到行分隔,所以我将发现的错误额外列放入了红移
我尝试了以下方法但没有成功:
- 返回lambda中的字符串
- 正在搜索如何在副本()中设置行delimeter
- 将列表转换为json而不是字符串。然后我在打开列表时遇到了问题
- 在copy语句中使用REMOVEQUOTES
我最初的问题是:“如何从s3复制到用双引号分隔的不同行的红移”,但问题可能是在我的第一种方法中,所以我决定将问题扩大一点
那么,我该如何解决这个问题呢 如果您希望向Amazon Redshift发送流式数据,可以使用Amazon Kinesis data Firehose。它内置了基于大小(MB)或时间(秒)的数据缓冲,用于批量写入Amazon Redshift
您是正确的,对红移执行小型INSERT
操作并不理想。批量加载数据要好得多。因此,如果您需要连续加载数据,Kinesis data Firehose将提供最佳的性能组合
您提到“动力流供给动力消防水带流”。可以直接从AWS Lambda函数写入Kinesis数据消防软管。为什么不删除Kinesis,直接从Lambda插入Redshift?您可以在python中轻松地以编程方式连接到Redshift,这将为您节省大量时间和金钱您使用的是Kinesis Streams还是Kinesis Firehose?如果您要发送到红移,那么更简单的方法是使用Kinesis Firehose,因为它会为您处理整个过程,自动缓冲并将内容发送到红移。我创建了一个Kinesis流,它会将信息发送到Kinesis Firehose(可能是问题吗?)。我不是直接从lambda插入,因为我问过,而且我被告知insert语句效率很低,每天需要插入400万行,这可能会大大降低数据库的速度eventually@JohnRotenstein你给我的主意是只用动情消防水带代替两者,如果你愿意,你可以回答这个问题
copy table
from blabla
BLANKSASNULL
DELIMITER ';'
EMPTYASNULL
NULL AS 'null'
ESCAPE
FILLRECORD;
A B C D no_info_column
"a b c d" <null>
"a,b,c,d" "a1,b1,c1,d1"