2017-09-19 12 views
1

Je veux écrire mon dataframe au système de fichiers local:Python & Spark: dataframe Write ne persiste pas sur le système de fichiers

path = "/tmp/test" 

df = spark.sql(select_str) 
df.write.parquet(path, mode="overwrite", compression="snappy") 

Le code fonctionne sans erreur, mais quand je regarde dans tmp il n'y a test Et aussi, si je veux lire de nouveau dans parquet pyarrow:

parquet = pq.ParquetDataset(path) 

Je reçois l'erreur:

IOError: Passed non-file path: /tmp/test 

Il en serait de même pour hdfs://tmp/test

Que manque-t-il ici?

EDIT

J'ai essayé de créer d'abord un fichier réel avant de l'utiliser. J'ai donc créé /tmp/parquet.parquet. Le fichier peut maintenant être lu mais il est toujours vide. Donc, l'écriture ne fonctionne tout simplement pas.

EDIT 2

Spark Config:

spark = SparkSession.builder \ 
    .master("yarn") \ 
    .appName("my_app") \ 
    .config("spark.driver.bindAddress", "0.0.0.0") \ 
    .config("spark.driver.host", host) \ 
    .config("spark.driver.port", port) \ 
    .config("spark.driver.memory", "4G") \ 
    .config("spark.executor.memory", "8G") \ 
    .config("spark.blockManager.port", portBlockManager) \ 
    .enableHiveSupport() \ 
    .getOrCreate() 

Répondre

1

où m ode lancez-vous votre application spark? Client/Cluster/Autonome? Puisque vous essayez d'enregistrer le fichier dans le système de fichiers local, vous devez savoir où votre pilote tourne (comme sur quelle machine).

Si c'est en mode cluster, il est très possible que le fichier soit écrit dans un nœud sur un cluster où le gestionnaire de ressources crée un pilote. Et votre meilleur moyen est de stocker le fichier dans hdfs, et par défaut c'est ce que fera df.write.parquet(path, mode="overwrite", compression="snappy").

Par défaut, le système de fichiers utilisé sera hdfs, donc si vous fournissez simplement /tmp/test, il recherche ce chemin dans hdfs et non dans le système de fichiers local.

En outre, je suppose que vous utilisez la bibliothèque pyarrow dans pq.ParquetDataset qui recherchera par défaut le chemin sur le système de fichiers local. S'assurer que vous utilisez le bon système de fichiers pendant la lecture/écriture le résoudra.

0

Essayez:

"file:///tmp/test" 

au lieu de:

"/tmp/test" 
+0

Ceci donne le même résultat – Mulgard