web-dev-qa-db-fra.com

Comment importer plusieurs fichiers csv en un seul chargement?

Considérez que j'ai un schéma défini pour le chargement de 10 fichiers CSV dans un dossier. Existe-t-il un moyen de charger automatiquement les tables avec Spark SQL. Je sais que cela peut être effectué en utilisant un cadre de données individuel pour chaque fichier [indiqué ci-dessous], mais peut-il être automatisé avec une seule commande que pointer un fichier puis-je pointer un dossier?

df = sqlContext.read
       .format("com.databricks.spark.csv")
       .option("header", "true")
       .load("../Downloads/2008.csv")
35
Chendur

Utilisez un caractère générique, par exemple remplacez 2008 par *:

df = sqlContext.read
       .format("com.databricks.spark.csv")
       .option("header", "true")
       .load("../Downloads/*.csv") // <-- note the star (*)

Spark 2.0

// these lines are equivalent in Spark 2.0
spark.read.format("csv").option("header", "true").load("../Downloads/*.csv")
spark.read.option("header", "true").csv("../Downloads/*.csv")

Remarques:

  1. Remplacez format("com.databricks.spark.csv") par la méthode format("csv") ou csv. Le format com.databricks.spark.csv A été intégré à la version 2.0.

  2. Utilisez spark pas sqlContext

82
Yaron

Reader's Digest: (Spark 2.x)

Par exemple, si vous avez 3 répertoires contenant des fichiers csv:

dir1, dir2, dir3

Vous définissez ensuite les chemins comme une chaîne de liste de chemins délimitée par des virgules, comme suit:

chemins = "dir1/, dir2/, dir3/*"

Ensuite, utilisez la fonction suivante et transmettez-lui cette chemin variable

def get_df_from_csv_paths(paths):

        df = spark.read.format("csv").option("header", "false").\
            schema(custom_schema).\
            option('delimiter', '\t').\
            option('mode', 'DROPMALFORMED').\
            load(paths.split(','))
        return df

En cours d'exécution:

df = get_df_from_csv_paths(paths)

Vous obtiendrez dans df un seul spark dataframe contenant les données de tous les csv trouvés dans ces 3 répertoires.

=========================================== ===============================

Version complète:

Si vous souhaitez acquérir plusieurs CSV à partir de plusieurs annuaires , il vous suffit de passer une liste et d'utiliser des caractères génériques.

Par exemple :

si votre chemin de données ressemble à ceci:

's3: // bucket_name/subbucket_name/2016-09 - */184/*,
s3: // bucket_name/subbucket_name/2016-10 - */184/*,
s3: // bucket_name/subbucket_name/2016-11 - */184/*,
s3: // bucket_name/subbucket_name/2016-12 - */184/*, ... '

vous pouvez utiliser la fonction ci-dessus pour ingérer tous les csv dans tous ces répertoires et sous-répertoires à la fois:

Cela ingérerait tous les répertoires de s3 nom_base/nom_subucket/conformément aux modèles de caractères génériques spécifiés. par exemple. le premier motif chercherait dans

nom_bucket/nom_bucket /

pour tous les répertoires avec des noms commençant par

2016-09-

et pour chacun de ceux-ci ne prennent que le répertoire nommé

184

et dans ce sous-répertoire, recherchez tous les fichiers csv.

Et cela serait exécuté pour chacun des modèles de la liste délimitée par des virgules.

Cela fonctionne bien mieux que l'union ..

14
eiTan LaVi

Notez que vous pouvez utiliser d'autres astuces telles que:

-- One or more wildcard:
       .../Downloads20*/*.csv
--  braces and brackets   
       .../Downloads201[1-5]/book.csv
       .../Downloads201{11,15,19,99}/book.csv
11
Jamal Jam

Ex1:

Lecture d'un seul fichier CSV. Indiquez le chemin complet du fichier:

 val df = spark.read.option("header", "true").csv("C:spark\\sample_data\\tmp\\cars1.csv")

Ex2:

Lecture de plusieurs fichiers CSV en passant des noms:

val df=spark.read.option("header","true").csv("C:spark\\sample_data\\tmp\\cars1.csv", "C:spark\\sample_data\\tmp\\cars2.csv")

Ex:

Lecture de plusieurs fichiers CSV en passant la liste des noms:

val paths = List("C:spark\\sample_data\\tmp\\cars1.csv", "C:spark\\sample_data\\tmp\\cars2.csv")
val df = spark.read.option("header", "true").csv(paths: _*)

Ex4:

Lecture de plusieurs fichiers CSV dans un dossier en ignorant les autres fichiers:

val df = spark.read.option("header", "true").csv("C:spark\\sample_data\\tmp\\*.csv")

Ex5:

Lecture de plusieurs fichiers CSV à partir de plusieurs dossiers:

val folders = List("C:spark\\sample_data\\tmp", "C:spark\\sample_data\\tmp1")
val df = spark.read.option("header", "true").csv(folders: _*)
5
mputha

En utilisant Spark 2.0+, nous pouvons charger plusieurs fichiers CSV à partir de différents répertoires en utilisant df = spark.read.csv(['directory_1','directory_2','directory_3'.....], header=True). Pour plus d'informations, consultez la documentation ici