web-dev-qa-db-fra.com

Comment lire les données de parquet de S3 à spark dataframe Python?

Je suis nouveau sur Spark et je ne le trouve pas ... J'ai beaucoup de fichiers de parquet téléchargés dans s3 à l'emplacement:

s3://a-dps/d-l/sco/alpha/20160930/parquet/

La taille totale de ce dossier est 20+ Gb ,. Comment segmenter et lire ceci dans une trame de données Comment charger tous ces fichiers dans une trame de données?

La mémoire allouée à spark est de 6 Go.

    from pyspark import SparkContext
    from pyspark.sql import SQLContext
    from pyspark import SparkConf
    from pyspark.sql import SparkSession
    import pandas
    # SparkConf().set("spark.jars.packages","org.Apache.hadoop:hadoop-aws:3.0.0-alpha3")
    sc = SparkContext.getOrCreate()

    sc._jsc.hadoopConfiguration().set("fs.s3.awsAccessKeyId", 'A')
    sc._jsc.hadoopConfiguration().set("fs.s3.awsSecretAccessKey", 's')

    sqlContext = SQLContext(sc)
    df2 = sqlContext.read.parquet("s3://sm/data/scor/alpha/2016/parquet/*")

Erreur :

 
 Py4JJavaError: Une erreur s'est produite lors de l'appel de o33.parquet. 
: Java.io.IOException: aucun système de fichiers pour le schéma: s3 
 Sur org.Apache.hadoop .fs.FileSystem.getFileSystemClass (FileSystem.Java:2660) 
 sur org.Apache.hadoop.fs.FileSystem.createFileSystem (FileSystem.Java:2667) 
 sur org.Apache.hadoop.fs .FileSystem.access 200 $ (FileSystem.Java:94) 
 Chez org.Apache.hadoop.fs.FileSystem $ Cache.getInternal (FileSystem.Java:2703) 
 Chez org.Apache.hadoop. fs.FileSystem $ Cache.get (FileSystem.Java:2685) 
 sur org.Apache.hadoop.fs.FileSystem.get (FileSystem.Java:373) 
 sur org.Apache.hadoop. fs.Path.getFileSystem (Path.Java:295) 
 at org.Apache.spark.sql.execution.datasources.DataSource $$ anonfun $ 14.apply (DataSource.scala: 372) 
 at org.Apache.spark.sql.execution.datasources.DataSource $$ anonfun $ 14.apply (DataSource.scala: 370) 
 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) 
 Sur scala.collection.TraversableLike $ class.flatMap (TraversableLike.scala: 241) 
 Sur scala.collection.immutable.List.flatMap (List .scala: 344) 
 
 
10
Viv

Le schéma de fichier (s3) que vous utilisez n'est pas correct. Vous devrez utiliser le s3n schéma ou s3a (pour les objets s3 plus gros):

// use sqlContext instead for spark <2 
val df = spark.read 
              .load("s3n://bucket-name/object-path")

Je vous suggère d'en savoir plus sur le module Hadoop-AWS: intégration avec Amazon Web Services Overview .

15
eliasah

Vous devez utiliser SparkSession au lieu de sqlContext depuis Spark 2.0

spark = SparkSession.builder
                        .master("local")             
                        .appName("app name")             
                        .config("spark.some.config.option", true).getOrCreate()

df = spark.read.parquet("s3://path/to/parquet/file.parquet")
12
Artem Ignatiev