web-dev-qa-db-fra.com

Lecture de DataFrame à partir d'un fichier de parquet partitionné

Comment lire un parquet partitionné avec condition en tant que trame de données,

cela fonctionne bien,

val dataframe = sqlContext.read.parquet("file:///home/msoproj/dev_data/dev_output/aln/partitions/data=jDD/year=2015/month=10/day=25/*")

La partition est là pour day=1 to day=30 est-il possible de lire quelque chose comme(day = 5 to 6) ou day=5,day=6,

val dataframe = sqlContext.read.parquet("file:///home/msoproj/dev_data/dev_output/aln/partitions/data=jDD/year=2015/month=10/day=??/*")

Si je mets * ça me donne toutes les données de 30 jours et c'est trop gros.

20
WoodChopper

sqlContext.read.parquet peut prendre plusieurs chemins en entrée. Si vous voulez juste day=5 et day=6, vous pouvez simplement ajouter deux chemins comme:

val dataframe = sqlContext
      .read.parquet("file:///your/path/data=jDD/year=2015/month=10/day=5/", 
                    "file:///your/path/data=jDD/year=2015/month=10/day=6/")

Si vous avez des dossiers sous day=X, comme par exemple country=XX, country sera automatiquement ajouté en tant que colonne dans le dataframe.

EDIT: à partir de Spark 1.6, il faut fournir une option "basepath" pour que Spark génère automatiquement des colonnes. Dans Spark 1.6.x ce qui précède devrait être réécrit comme ceci pour créer une trame de données avec les colonnes "données", "année", "mois" et "jour":

val dataframe = sqlContext
     .read
     .option("basePath", "file:///your/path/")
     .parquet("file:///your/path/data=jDD/year=2015/month=10/day=5/", 
                    "file:///your/path/data=jDD/year=2015/month=10/day=6/")
58

Si vous souhaitez lire pendant plusieurs jours, par exemple day = 5 et day = 6 et souhaitons mentionner la plage dans le chemin lui-même, des caractères génériques peuvent être utilisés:

val dataframe = sqlContext
  .read
  .parquet("file:///your/path/data=jDD/year=2015/month=10/day={5,6}/*")

Les caractères génériques peuvent également être utilisés pour spécifier une plage de jours:

val dataframe = sqlContext
  .read
  .parquet("file:///your/path/data=jDD/year=2015/month=10/day=[5-10]/*")

Cela correspond à tous les jours de 5 à 10.

15

vous devez fournir mergeSchema = true option. comme mentionné ci-dessous (cela vient de 1.6.0):

val dataframe = sqlContext.read.option("mergeSchema", "true").parquet("file:///your/path/data=jDD")

Cela lira tous les fichiers de parquet dans le cadre de données et créera également des colonnes année, mois et jour dans les données du cadre de données.

Réf: https://spark.Apache.org/docs/1.6.0/sql-programming-guide.html#schema-merging

5
Kiran N