为了账号安全,请及时绑定邮箱和手机立即绑定

从 Azure Blob 容器读取 parquet 数据,无需在本地下载

从 Azure Blob 容器读取 parquet 数据,无需在本地下载

白衣非少年 2022-11-10 15:16:15
我正在使用 azure SDK、avro-parquet 和 hadoop 库从 Blob Container 中读取 parquet 文件。目前,我正在将文件下载到临时文件,然后创建一个 ParquetReader。try (InputStream input = blob.openInputStream()) {                Path tmp = Files.createTempFile("tempFile", ".parquet");                Files.copy(input, tmp, StandardCopyOption.REPLACE_EXISTING);                IOUtils.closeQuietly(input);                InputFile file = HadoopInputFile.fromPath(new org.apache.hadoop.fs.Path(tmp.toFile().getPath()),                        new Configuration());                ParquetReader<GenericRecord> reader = AvroParquetReader.<GenericRecord> builder(file).build();                GenericRecord record;                while ((record = reader.read()) != null) {                    recordList.add(record);                }            } catch (IOException | StorageException e) {                log.error(e.getMessage(), e);            }我想使用 azure blob 项目中的 inputStream 读取此文件,而不将其下载到我的机器上。S3 有这样的方式(从 AWS s3 存储桶读取镶木地板数据),但是 Azure 是否存在这种可能性?
查看完整描述

1 回答

?
慕森王

TA贡献1777条经验 获得超3个赞

了解如何做到这一点。


 StorageCredentials credentials = new StorageCredentialsAccountAndKey(accountName, accountKey);

 CloudStorageAccount connection = new CloudStorageAccount(credentials, true);

 CloudBlobClient blobClient = connection.createCloudBlobClient();

 CloudBlobContainer container = blobClient.getContainerReference(containerName);


 CloudBlob blob = container.getBlockBlobReference(fileName);


 Configuration config = new Configuration();

 config.set("fs.azure", "org.apache.hadoop.fs.azure.NativeAzureFileSystem");

 config.set("fs.azure.sas.<containerName>.<accountName>.blob.core.windows.net", token);

 URI uri = new URI("wasbs://<containerName>@<accountName>.blob.core.windows.net/" + blob.getName());

 InputFile file = HadoopInputFile.fromPath(new org.apache.hadoop.fs.Path(uri),

                config);

 ParquetReader<GenericRecord> reader = AvroParquetReader.<GenericRecord> builder(file).build();


 GenericRecord record;

 while ((record = reader.read()) != null) {

     System.out.println(record);

 }

 reader.close();


查看完整回答
反对 回复 2022-11-10
  • 1 回答
  • 0 关注
  • 176 浏览

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号