如何将非常大的 csv 导入 dynamodb?

问题描述 投票:0回答:2

所以我的 s3 数据库中有非常大的 csv 文件(超过 200 万行),我想将其导入到 dynamodb。

我尝试过的:

  1. 拉姆达 我设法让 lambda 函数正常工作,但在我的函数超时后,只有大约 120k 行被导入到 ddb。

  2. 管道 使用管道时,它卡在“等待跑步者”上,然后完全停止

csv amazon-s3 amazon-dynamodb
2个回答
1
投票

这是一种无服务器方法,使用 2 个 Lambda 和一个 SQS 队列来处理小块中的大

.csv

  1. 使用一次性 Reader Lambda,使用 S3 Select SQL 到
    SELECT s.primary_key FROM S3Object s
    提取所有记录的主键信息,并就地查询
    .csv
    。 有关详细信息,请参阅 SelectObjectContent API。
  2. Reader Lambda 将主键放入 SQS 队列中。 添加死信队列来捕获错误。
  3. 将队列添加为 Writer Lambda 的事件源。 启用批处理。如果需要的话限制并发。
  4. 并行写入器 Lambda 调用使用 S3 Select 从
    .csv
    获取其批次主键的记录:
    SELECT * WHERE s.primary_key IN ('id1', 'id2', 'id3') FROM S3Object s
  5. Writer Lambda 将其批量记录写入 DynamoDB 表。

0
投票

您可以使用 DynamoDbStorageHandler 连接器设置外部 EMR 表(或者可能是 Athena,这样您就不需要 EMR 集群),一张用于 S3 文件,一张用于 DynamoDb 表。它支持仅通过在表之间运行插入和选择来将数据从 DynamoDB 复制到 S3,也支持从 S3 复制到 DynamoDB。

设置外部 S3 文件表的示例操作系统是

CREATE EXTERNAL TABLE s3_features_csv
    (feature_id       BIGINT,
    feature_name      STRING,
    feature_class     STRING,
    state_alpha       STRING,
    prim_lat_dec      DOUBLE,
    prim_long_dec     DOUBLE,
    elev_in_ft        BIGINT)
ROW FORMAT DELIMITED
FIELDS TERMINATED BY ','
LOCATION 's3://<your_bucket>/<prefix_of_folder_containing_files>';

设置 DynamoDB 外部表的方法是:

CREATE EXTERNAL TABLE ddb_features
    (feature_id   BIGINT,
    feature_name  STRING,
    feature_class STRING,
    state_alpha   STRING,
    prim_lat_dec  DOUBLE,
    prim_long_dec DOUBLE,
    elev_in_ft    BIGINT)
STORED BY 'org.apache.hadoop.hive.dynamodb.DynamoDBStorageHandler'
TBLPROPERTIES(
    "dynamodb.table.name" = "Features",
    "dynamodb.column.mapping"="feature_id:Id,feature_name:Name,feature_class:Class,state_alpha:State,prim_lat_dec:Latitude,prim_long_dec:Longitude,elev_in_ft:Elevation"
);
© www.soinside.com 2019 - 2024. All rights reserved.