首页 > 解决方案 > 如何使用 Java 逐行从 Google Cloud Storage 读取巨大的 CSV 文件?

问题描述

我是谷歌云平台的新手。我正在尝试逐行读取 Google Cloud Storage(通过服务帐户密钥访问的非公共存储桶)中存在的 CSV 文件,大小约为 1GB。

我找不到任何选项来逐行读取 Google Cloud Storage (GCS) 中存在的文件。我只看到按块大小/字节大小选项读取。由于我正在尝试读取 CSV,因此我不想使用按块大小读取,因为它可能会在读取时拆分记录。

迄今为止尝试的解决方案: 尝试将 GCS 中存在的 CSV 文件中的内容复制到临时本地文件,并使用以下代码读取临时文件。下面的代码按预期工作,但我不想将大文件复制到我的本地实例。相反,我想从 GCS 中逐行读取。

    StorageOptions options = 
    StorageOptions.newBuilder().setProjectId(GCP_PROJECT_ID)
            .setCredentials(gcsConfig.getCredentials()).build();
    Storage storage = options.getService();
    Blob blob = storage.get(BUCKET_NAME, FILE_NAME);
    ReadChannel readChannel = blob.reader();
    FileOutputStream fileOuputStream = new FileOutputStream(TEMP_FILE_NAME);
    fileOuputStream.getChannel().transferFrom(readChannel, 0, Long.MAX_VALUE);
    fileOuputStream.close();

请提出方法。

标签: google-cloud-platformgoogle-cloud-storagenio

解决方案


因为,我正在进行批处理,所以我在我的 ItemReader 的 init() 方法中使用下面的代码,该方法用 @PostConstruct 注释。在我的 ItemReader 的 read() 中,我正在构建一个列表。列表大小与块大小相同。通过这种方式,我可以根据我的 chunkSize 读取行,而不是一次读取所有行。

StorageOptions options = 
StorageOptions.newBuilder().setProjectId(GCP_PROJECT_ID)
        .setCredentials(gcsConfig.getCredentials()).build();
Storage storage = options.getService();
Blob blob = storage.get(BUCKET_NAME, FILE_NAME);
ReadChannel readChannel = blob.reader();
BufferedReader br = new BufferedReader(Channels.newReader(readChannel, "UTF-8"));

推荐阅读