Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/amazon-web-services/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何通过Kinesis将数据从Lambda(Python)发送到Redshift_Python_Amazon Web Services_Amazon S3_Aws Lambda_Amazon Redshift - Fatal编程技术网

如何通过Kinesis将数据从Lambda(Python)发送到Redshift

如何通过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

我在Python中有一个lambda函数,它生成一些东西并返回一些需要在红移中插入的值。在lambda中,我将值推送到Kinesis,后者在S3中复制它们,然后在Redshift中复制它们

lambda中的值以字符串形式获得,如下所示:

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"