【问题标题】:Read parquet data from Azure Blob container without downloading it locally从 Azure Blob 容器读取 parquet 数据,无需在本地下载
【发布时间】:2019-09-25 08:16:04
【问题描述】:

我正在使用 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有这种方式(Read parquet data from AWS s3 bucket),但是Azure有这种可能性吗?

【问题讨论】:

  • 您的 Java 程序会在 Azure HDInsight 上运行吗?或者你只是想在本地机器上运行它?
  • 大部分在本地,不仅在天蓝色云上,是的

标签: java azure streaming parquet


【解决方案1】:

了解如何做到这一点。

 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();

【讨论】:

    猜你喜欢
    • 2020-05-15
    • 1970-01-01
    • 1970-01-01
    • 2021-12-26
    • 1970-01-01
    • 2018-04-13
    • 2020-09-08
    • 1970-01-01
    • 2022-08-03
    相关资源
    最近更新 更多