Spark для чтения файлов BlobStorage "java.io.IOException: нет файловой системы для схемы: https" - PullRequest
1 голос
/ 23 сентября 2019

В настоящее время я использую пакеты azure-storage-blob и hadoop-azure для загрузки файлов из хранилища BLOB-объектов в локальную систему.

...
String url = "https://blob_storage_url";

String filename = url.replaceFirst("https.*/", "");

// Setup the cloud storage account
String storageConnectionString = "...";
CloudStorageAccount account = CloudStorageAccount.parse(storageConnectionString);

// Create a blob service client
CloudBlobClient blobClient = account.createCloudBlobClient();

// Get a reference to a container
CloudBlobContainer container = blobClient.getContainerReference(containerName);

for (ListBlobItem blobItem : container.listBlobs(filename)) {
    // If the item is a blob, not a virtual directory
    if (blobItem instanceof CloudBlockBlob) {
        // Download the file
        CloudBlockBlob retrievedBlob = (CloudBlockBlob) blobItem;
        retrievedBlob.downloadToFile(filename);
    }
}
...

Эти загруженные файлы на самом деле являются файлами XML.Затем я должен обработать контент для каждого.Для этого я использую пакет spark-xml_2.11 (com.databricks.spark.xml).

StructType schema = new StructType()
    .add("attr1", DataTypes.StringType, false)
    .add("attr2", DataTypes.IntegerType, false)
    ... other_structFields_or_structTypes;

Dataset<Row> dataset = sparkSession.read()
    .format("com.databricks.spark.xml")
    .schema(schema)
    .load(filename)

Для метода load () требуется путь (данные, поддерживаемые локальной или распределенной файловой системой),Итак, есть ли возможность загружать их из хранилища BLOB-объектов напрямую?

Я нашел это руководство https://docs.databricks.com/spark/latest/data-sources/azure/azure-storage.html Но для первого варианта, монтирования контейнеров хранилища BLOB-объектов Azure в DBFS, требуется кластер Databrick.

Со вторым вариантом, напрямую доступ к хранилищу BLOB-объектов Azure, я тестировал настройку ключа доступа к учетной записи ранее.

sparkSession.sparkContext().hadoopConfiguration().set(
    "fs.azure.account.key.<my-storage-account-name>.blob.core.windows.net",
    "<my-storage-account-access-key>"
);

StructType schema = new StructType()
    .add("attr1", DataTypes.StringType, false)
    .add("attr2", DataTypes.IntegerType, false)
    ... other_structFields_or_structTypes;

Dataset<Row> dataset = sparkSession.read()
    .format("com.databricks.spark.xml")
    .schema(schema)
    .load(filename) # also I tried with the full url

Но возникло следующее исключение:

"java.io.IOException: No FileSystem for scheme: https". 

Кроме того, я попытался изменить протокол на wasbs, но опять возникло похожее исключение:

"java.io.IOException: No FileSystem for scheme: wasbs".

Пожалуйста, какие-либо предложения или комментарии?

...