google-cloud-platform - 如何使用 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();
请提出方法。
解决方案
因为,我正在进行批处理,所以我在我的 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"));
推荐阅读
- reactjs - Reactstrap - 如何在按钮内正确渲染微调器?
- php - is there any option print 0 if array position is null?
- c - How is this function printing an integer in binary form?
- python - Telegram API 不适用于用户名 - 400。错误请求:未找到聊天
- node.js - 在 node.js 中提供 gzipped 构建
- algorithm - Big-O algorithm
- php - Woocommerce - 重定向到已收到订单的页面,但未显示订单详细信息
- google-cloud-platform - 临时访问 GCP 资源
- asp.net-mvc - how to generate a checkbox in mvc?
- javascript - React Native 的登录身份验证问题