Я пытаюсь перечислить все объекты в корзине, а затем прочитать некоторые или все из них как CSV.Я потратил два дня, пытаясь сделать оба, но я могу работать только по одному, если использую библиотеки Google.
Я думаю, что проблема заключается в несовместимости между собственными библиотеками Google, ноЯ не совсем уверен.Во-первых, я думаю, что должен показать, как я делаю каждую вещь.
Вот как я читаю один файл.В моей версии Scala вы можете использовать gs://
url с spark.read.csv
:
val jsonKeyFile = "my-local-keyfile.json"
ss.sparkContext.hadoopConfiguration.set("google.cloud.auth.service.account.json.keyfile", jsonKeyFile)
spark.read
.option("header", "true")
.option("sep", ",")
.option("inferSchema", "false")
.option("mode", "FAILFAST")
.csv(gcsFile)
Это на самом деле работает в одиночку, и я получаю из него рабочий DF.Тогда возникает проблема, когда я пытаюсь добавить библиотеку Google Storage:
libraryDependencies += "com.google.cloud" % "google-cloud-storage" % "1.70.0"
Если я пытаюсь снова запустить тот же код, я получаю этого плохого парня из вызова .csv:
Using Spark's default log4j profile: org/apache/spark/log4j-defaults.properties
19/05/14 16:38:00 WARN NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable
An exception or error caused a run to abort: Class com.google.common.base.Suppliers$SupplierOfInstance does not implement the requested interface java.util.function.Supplier
java.lang.IncompatibleClassChangeError: Class com.google.common.base.Suppliers$SupplierOfInstance does not implement the requested interface java.util.function.Supplier
at com.google.cloud.hadoop.fs.gcs.GoogleHadoopFileSystemBase.getGcsFs(GoogleHadoopFileSystemBase.java:1488)
at com.google.cloud.hadoop.fs.gcs.GoogleHadoopFileSystemBase.configure(GoogleHadoopFileSystemBase.java:1659)
at com.google.cloud.hadoop.fs.gcs.GoogleHadoopFileSystemBase.initialize(GoogleHadoopFileSystemBase.java:683)
at com.google.cloud.hadoop.fs.gcs.GoogleHadoopFileSystemBase.initialize(GoogleHadoopFileSystemBase.java:646)
at org.apache.hadoop.fs.FileSystem.createFileSystem(FileSystem.java:3303)
at org.apache.hadoop.fs.FileSystem.access$200(FileSystem.java:124)
...(lots more trace, probably irrelevant)
Тогда вы можете спросить, почему бы вам просто не воспользоваться библиотекой?Хорошо ... Это код, который перечисляет объекты в корзине:
StorageOptions
.newBuilder()
.setCredentials(ServiceAccountCredentials.fromStream(
File(jsonKeyFile).inputStream()))
.build()
.getService
.list(bucket)
.getValues
.asScala
.map(irrelevant)
.toSeq
.toDF("irrelevant")
И я пока не нашел способа сделать это легко без указанной библиотеки.