2016-07-14 1 views
2

J'essaie d'utiliser Spark (PySpark) pour analyser des données stockées dans des GeoTiff multibande. Je suis toujours un peu un débutant Spark.Données PySpark et Raster (GeoTiff)


Configuration:

Les GeoTIFFs sont eux-mêmes assez petit pour fonctionner en python pur - je suis spécifiquement GDAL pour lire les données. Je crée ensuite des dataframes et je fais l'analyse.

Cependant, l'analyse prend un certain temps. Et, sur une base récurrente, j'aurai des centaines de géotiffs à analyser - entrer dans PySpark.


Problème:

J'ai écrit du code qui me permet de lancer l'analyse sur un pseudo-cluster local. Cependant, il échoue avec le cluster approprié car les données stockées sur le nœud maître ne peuvent pas être lues localement par les nœuds de travail.

HDFS devrait venir à la rescousse, cependant sc.textFile(..) renvoie le contenu brut non traité du géotiff qui n'est pas très utile.

Je pourrais pré-traiter les données pour transformer les géotiffs en csv mais le surcoût supplémentaire pourrait ne pas valoir la peine.

Les deux solutions que j'avais espoir de trouver étaient

  • Une méthode d'allumage, permet de l'appeler sc.rasterFile(...), qui lirait un geotiff dans une trame de données d'allumage ou RDD
  • La possibilité d'accéder hdfs de méthodes python pures. Quelque chose comme ~

    gdal.Open("hdfs://...", gc.GA_ReadOnly)


Questions:

  1. Ai-je raison de supposer que ni des solutions ci-dessus sont possibles?
  2. Existe-t-il d'autres outils/méthodes/API pour travailler avec TIFF dans Spark?

Merci!

Répondre

0

Si vous voulez lire et tout de traiter les fichiers l'approche la plus simple est de combiner binaryFiles et io Module:

from io import BytesIO 

(sc 
    .binaryFiles(path) 
    .values() 
    .map(BytesIO) 
    .map(some_function_which_expects_opened_binary_file)) 

En ce qui concerne vos requêtes restantes:

  • Il n'y a pas sc.rasterFile mais il y a quelques les formats d'entrée de traitement d'image fournis par Hipi qui peuvent être utilisés dans Spark avec SparkContext.hadoopFile.
  • Il est possible de lire directement à partir d'un système de fichiers distribué compatible Posix ou même HDFS (par exemple avec hdfs3) mais ces méthodes ne prendront pas en compte la localité de données et peuvent entraîner des performances sous-optimales.