簡體   English   中英

如何通過 Kinesis 將數據從 Lambda (Python) 發送到 Redshift

[英]How to send data from Lambda (Python) to Redshift through Kinesis

我在 Python 中有一個 lambda 函數,它可以制作一些東西並返回一些需要插入 Redshift 的值。 在 lambda 中,我將值推送到 Kinesis,后者將它們復制到 S3 中,然后復制到 Redshift 中。

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

final_string = 'a;b;d;c'

每個字母都是 Redshift 表中不同列的值,因此分隔符是“;”。 然后我將數據推送到 Kinesis Stream:

put_response = kinesis_client.put_record(StreamName = 'PixelTrack',
                                            Data=json.dumps(final_string),
                                           PartitionKey='first')

然后,Kinesis 流向 Kinesis Firehose 流提供數據。 在 S3 中使用 Kinesis Firehose 生成的文件類似於(包括文件中的引號):

"a;b;c;d;c" 

最后,我使用以下語句(在 Kinesis firehose 中配置)將數據復制到 redshift:

copy table
from blabla
BLANKSASNULL 
DELIMITER ';' 
EMPTYASNULL 
NULL AS 'null' 
ESCAPE 
FILLRECORD;

當 Kinesis 中僅緩沖一個結果時,我設法使其工作並獲取 Redshift 中的值(不過,在 Redshift 中創建一個新列)。 因此,當在緩沖時間內只執行了一個 lambda 時,Redshift 表如下所示:

  A        B         C         D     no_info_column
  "a       b         c         d"        <null>

當我多次執行 lambda 時出現問題,因為我在 S3 中獲得了一個文件,其中包含以下文本:

"a,b,c,d" "a1,b1,c1,d1"

我在 Redshift 中找到了錯誤Extra column(s) found ,因為復制語句無法找到行分隔符。

我嘗試了以下方法但沒有成功:

  • 返回 lambda 中的字符串
  • 搜索如何在副本中設置行分隔符( SO問題
  • 將列表轉換為 json 而不是字符串。 然后我在打開列表時遇到了括號問題
  • 在復制語句中使用 REMOVEQUOTES

我最初的問題是:“如何從 s3 復制到 redshift,不同的行用雙引號分隔”,但問題可能出在我的第一種方法或其他方面,所以我決定讓這個問題更廣泛一點.

那么,我該如何解決呢?

如果您希望將流數據發送到 Amazon Redshift,可以使用 Amazon Kinesis Data Firehose。 它具有基於大小 (MB) 或時間(秒)的內置數據緩沖,用於批量寫入 Amazon Redshift。

您是正確的,在 Redshift 上執行小型INSERT操作並不理想。 批量加載數據要好得多。 因此,如果您需要連續加載數據,Kinesis Data Firehose 可以提供最佳的性能組合。

您提到“kinesis 流為 Kinesis Firehose 流提供食物”。 隨意直接從 AWS Lambda 函數寫入 Kinesis Data Firehose。

目前正在開發一項功能(可在預覽版中獲得)直接從 kinesis 流攝取到 redshift: https ://docs.aws.amazon.com/redshift/latest/dg/materialized-view-streaming-ingestion.html

您必須根據需要刷新視圖。 可能值得一看。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM