Как прочитать csv-файл из корзины S3 и создать фрейм данных в pyspark?

#python-3.x #dataframe #pyspark #apache-spark-sql

#python-3.x #фрейм данных #pyspark #apache-spark-sql

Вопрос:

Я пытаюсь прочитать csv-файл из s3 и создать фрейм данных, но не получаю результата. Не могли бы вы помочь мне, как это сделать? Ключ доступа и секретный ключ я здесь не ставлю. Я импортировал все библиотеки и создал искровое соединение.

Пример:

 spark = SparkSession.builder.appName("CsvReader").getOrCreate()

spark._jsc.hadoopConfiguration().set("fs.s3a.access.key", 'access_key')
spark._jsc.hadoopConfiguration().set("fs.s3a.secret.key", "secret_key")
spark._jsc.hadoopConfiguration().set("fs.s3a.impl","org.apache.hadoop.fs.s3a.S3AFileSystem")
spark._jsc.hadoopConfiguration().set("com.amazonaws.services.s3.enableV4", "true")
spark._jsc.hadoopConfiguration().set("fs.s3a.aws.credentials.provider","org.apache.hadoop.fs.s3a.BasicAWSCredentialsProvider")
spark._jsc.hadoopConfiguration().set("fs.s3a.endpoint", "eu-west-3.amazonaws.com")

df = spark.read.format('csv').options(header='true', inferSchema='true').load('s3a://itx-acm-medaff-dev-sourcefiles/hta/Inbound/RawLayer/non_onco_cell_gene/non_onco_cell_gene_20201119.csv')
 

Ошибка:

 Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/local/spark-2.0.0-bin-hadoop2.7/python/pyspark/sql/readwriter.py", line 147, in load
    return self._df(self._jreader.load(path))
  File "/usr/local/spark-2.0.0-bin-hadoop2.7/python/lib/py4j-0.10.1-src.zip/py4j/java_gateway.py", line 933, in __call__
  File "/usr/local/spark-2.0.0-bin-hadoop2.7/python/pyspark/sql/utils.py", line 63, in deco
    return f(*a, **kw)
  File "/usr/local/spark-2.0.0-bin-hadoop2.7/python/lib/py4j-0.10.1-src.zip/py4j/protocol.py", line 312, in get_return_value
py4j.protocol.Py4JJavaError: An error occurred while calling o232.load.
: java.lang.RuntimeException: java.lang.ClassNotFoundException: Class org.apache.hadoop.fs.s3a.S3AFileSystem not found
        at org.apache.hadoop.conf.Configuration.getClass(Configuration.java:2195)
        at org.apache.hadoop.fs.FileSystem.getFileSystemClass(FileSystem.java:2638)
        at org.apache.hadoop.fs.FileSystem.createFileSystem(FileSystem.java:2651)
        at org.apache.hadoop.fs.FileSystem.access$200(FileSystem.java:92)
        at org.apache.hadoop.fs.FileSystem$Cache.getInternal(FileSystem.java:2687)
        at org.apache.hadoop.fs.FileSystem$Cache.get(FileSystem.java:2669)
        at org.apache.hadoop.fs.FileSystem.get(FileSystem.java:371)
        at org.apache.hadoop.fs.Path.getFileSystem(Path.java:295)
        at org.apache.spark.sql.execution.datasources.DataSource$anonfun$12.apply(DataSource.scala:352)
        at org.apache.spark.sql.execution.datasources.DataSource$anonfun$12.apply(DataSource.scala:350)
        at scala.collection.TraversableLike$anonfun$flatMap$1.apply(TraversableLike.scala:241)
        at scala.collection.TraversableLike$anonfun$flatMap$1.apply(TraversableLike.scala:241)
        at scala.collection.immutable.List.foreach(List.scala:381)
        at scala.collection.TraversableLike$class.flatMap(TraversableLike.scala:241)
        at scala.collection.immutable.List.flatMap(List.scala:344)
        at org.apache.spark.sql.execution.datasources.DataSource.resolveRelation(DataSource.scala:350)
        at org.apache.spark.sql.DataFrameReader.load(DataFrameReader.scala:149)
        at org.apache.spark.sql.DataFrameReader.load(DataFrameReader.scala:132)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at java.lang.reflect.Method.invoke(Method.java:498)
        at py4j.reflection.MethodInvoker.invoke(MethodInvoker.java:237)
        at py4j.reflection.ReflectionEngine.invoke(ReflectionEngine.java:357)
        at py4j.Gateway.invoke(Gateway.java:280)
        at py4j.commands.AbstractCommand.invokeMethod(AbstractCommand.java:128)
        at py4j.commands.CallCommand.execute(CallCommand.java:79)
        at py4j.GatewayConnection.run(GatewayConnection.java:211)
        at java.lang.Thread.run(Thread.java:748)
Caused by: java.lang.ClassNotFoundException: Class org.apache.hadoop.fs.s3a.S3AFileSystem not found
        at org.apache.hadoop.conf.Configuration.getClassByName(Configuration.java:2101)
        at org.apache.hadoop.conf.Configuration.getClass(Configuration.java:2193)
        ... 28 more
 

Ответ №1:

Привет, кажется, вам не хватает jar, если вы используете команду spark-submit, убедитесь, что она доступна для всех узлов в одном и том же месте (это может быть hdfs / s3 / локальная файловая система), если вы используете оболочку pyspark, попробуйте скопировать и вставить jar в sparkпапка jars (если вы используете anaconda pyspark), эта папка будет находиться внутри ~Anaconda3 Lib site-packagespyspark jars

https://mvnrepository.com/artifact/org.apache.hadoop/hadoop-aws/2.7.3

Надеюсь, это поможет и решит вашу проблему. PS при загрузке jar убедитесь, что он соответствует версии hadoop, которая у вас есть