【问题标题】:How to read a CSV stream from S3, but starting from somewhere in the middle of the file?如何从 S3 读取 CSV 流,但从文件中间的某个位置开始?
【发布时间】:2021-07-11 03:58:59
【问题描述】:

正如标题所述,我的问题主要与从 AWS S3 读取 CSV 数据有关。我将提供有关我正在使用的其他技术的详细信息,但它们对于核心问题并不重要。

上下文(不是核心问题,只是一些额外的细节)

我有一个用例,我需要在 AWS Lambda 上使用 Node.js API 处理一些非常大的 CSV,并将每个 CSV 行中的一些数据存储到 DynamoDB。

我的实现适用于中小型 CSV 文件。但是,对于大型 CSV 文件(想想 100k - 1m 行),该过程需要超过 15 分钟(AWS Lambda 函数的最长执行时间)。

我真的需要这个实现是无服务器的(因为项目的其余部分是无服务器的,因为缺乏可预测的使用模式等等......)。

所以我决定尝试处理文件的开头 14.5 分钟左右,然后排队一个新的 Lambda 函数以从最后一个停止的地方继续。

我可以轻松地将最后一个函数的行号传递给新函数,因此新的 Lambda 函数知道从哪里开始。

因此,如果第一个函数处理了第 1 - 15,000 行,那么第二个函数将在第 15,001 行获取处理作业并从那里继续。这部分很简单。

但我不知道如何从中间开始从 S3 开始读取流。无论我如何设置读取流,它总是从文件的开头开始数据流。

不可能将处理任务分解成更小的部分(例如为每一行排队新的 Lambda),因为我已经完成了这项工作并将流程优化到尽可能少。

即使第二个作业从文件开头开始读取并且我将其设置为跳过已处理的行,到达文件末尾仍然需要很长时间。

即使我做了一些其他的实现(比如使用 EC2 而不是 Lambda),我仍然会遇到同样的问题。如果 EC2 进程在第 203,001 行失败怎么办?我需要排队一个新工作才能从下一行接。无论我使用什么技术或容器/环境,我仍然需要能够从文件中间读取。

核心问题

所以...假设我有一个保存到 S3 的 CSV 文件。而且我知道我想从第 15,001 行开始阅读。或者,我想从第 689,475 个字节开始读取。或其他。

有没有办法做到这一点?使用适用于 Node.js 的 AWS 开发工具包或任何其他类型的请求?

我知道如何在 Node.js 中设置来自 S3 的读取流,但我不知道它在后台是如何工作的,就如何发出请求而言。也许这些知识会有所帮助。

【问题讨论】:

    标签: node.js amazon-s3 lambda aws-lambda amazon-dynamodb


    【解决方案1】:

    啊,这比我做的要容易得多...这是 Node.js 中的答案:

    new aws.S3()
        .getObject({
            Key: 'bigA$$File.csv',
            Bucket: 'bucket-o-mine',
            Range: 'bytes=65000-100000',
        })
        .createReadStream()
    

    这里是文档:https://docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/S3.html

    您可以在任何 AWS 开发工具包中或通过 HTTP 标头执行此操作。

    以下是 AWS 对 range 标头的评价:

    下载对象的指定范围字节。有关 HTTP Range 标头的更多信息,请参阅https://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.35

    【讨论】:

    • 也许您可以提供几乎相同的帮助 - 跳过第一行(标题)?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-06
    • 2014-08-12
    • 1970-01-01
    • 2020-11-12
    • 1970-01-01
    相关资源
    最近更新 更多