web-dev-qa-db-fra.com

Lecture de fichiers de parquet à partir de plusieurs répertoires dans Pyspark

J'ai besoin de lire des fichiers de parquet à partir de plusieurs chemins qui ne sont pas des répertoires parents ou enfants. 

par exemple, 

dir1 ---
       |
       ------- dir1_1
       |
       ------- dir1_2
dir2 ---
       |
       ------- dir2_1
       |
       ------- dir2_2

sqlContext.read.parquet(dir1) lit les fichiers de parquet à partir de dir1_1 et dir1_2

En ce moment, je lis chaque répertoire et fusionne des images en utilisant "unionAll". Existe-t-il un moyen de lire les fichiers de parquet à partir de dir1_2 et dir2_1 sans utiliser unionAll ou existe-t-il un moyen élégant en utilisant unionAll

Merci

7
joshsuihn

Un peu tard mais j'ai trouvé ceci pendant que je cherchais et cela peut aider quelqu'un d'autre ...

Vous pouvez également essayer de décompresser la liste d’arguments en spark.read.parquet()

paths=['foo','bar']
df=spark.read.parquet(*paths)

C'est pratique si vous voulez passer quelques blobs dans l'argument path:

basePath='s3://bucket/'
paths=['s3://bucket/partition_value1=*/partition_value2=2017-04-*',
       's3://bucket/partition_value1=*/partition_value2=2017-05-*'
      ]
df=spark.read.option("basePath",basePath).parquet(*paths)

C'est cool car vous n'avez pas besoin de lister tous les fichiers du chemin de base, et vous obtenez toujours l'inférence de partition.

14
N00b

La méthode parquetFile de SQLContext et la méthode parquet de DataFrameReader suivent plusieurs chemins. Donc l'une ou l'autre de ces œuvres:

df = sqlContext.parquetFile('/dir1/dir1_2', '/dir2/dir2_1')

ou

df = sqlContext.read.parquet('/dir1/dir1_2', '/dir2/dir2_1')
6
John Conley

Prenant juste la réponse de John Conley, et l'embellissant un peu et fournissant le code complet (utilisé dans Jupyter PySpark) car j'ai trouvé sa réponse extrêmement utile.

from hdfs import InsecureClient
client = InsecureClient('http://localhost:50070')

import posixpath as psp
fpaths = [
  psp.join("hdfs://localhost:9000" + dpath, fname)
  for dpath, _, fnames in client.walk('/eta/myHdfsPath')
  for fname in fnames
]
# At this point fpaths contains all hdfs files 

parquetFile = sqlContext.read.parquet(*fpaths)


import pandas
pdf = parquetFile.toPandas()
# display the contents nicely formatted.
pdf
2
VenVig