web-dev-qa-db-fra.com

Comment nommer le fichier quand saveAsTextFile dans spark?

Lors de la sauvegarde en tant que fichier texte dans spark version 1.5.1, j’utilise: rdd.saveAsTextFile('<drectory>').

Mais si je veux trouver le fichier dans ce répertoire, comment puis-je le nommer ce que je veux?

Actuellement, je pense qu'il s'appelle part-00000, ce qui doit être une valeur par défaut. Comment puis-je lui donner un nom?

6
Hunle

Comme je l'ai dit dans mon commentaire ci-dessus, la documentation avec des exemples peut être trouvée ici . Et en citant la description de la méthode saveAsTextFile:

Enregistrez ce RDD en tant que fichier texte en utilisant des représentations sous forme de chaîne d'éléments.

Dans l'exemple suivant, j'enregistre un RDD simple dans un fichier, puis je le charge et en imprime le contenu.

samples = sc.parallelize([
    ("[email protected]", "Alberto", "Bonsanto"),
    ("[email protected]", "Miguel", "Bonsanto"),
    ("[email protected]", "Stranger", "Weirdo"),
    ("[email protected]", "Dakota", "Bonsanto")
])

print samples.collect()

samples.saveAsTextFile("folder/here.txt")
read_rdd = sc.textFile("folder/here.txt")

read_rdd.collect()

La sortie sera

('[email protected]', 'Alberto', 'Bonsanto')
('[email protected]', 'Miguel', 'Bonsanto')
('[email protected]', 'Stranger', 'Weirdo')
('[email protected]', 'Dakota', 'Bonsanto')

[u"('[email protected]', 'Alberto', 'Bonsanto')",
 u"('[email protected]', 'Miguel', 'Bonsanto')",
 u"('[email protected]', 'Stranger', 'Weirdo')",
 u"('[email protected]', 'Dakota', 'Bonsanto')"]

Jetons un coup d'oeil en utilisant un terminal basé sur Unix.

usr@Host:~/folder/here.txt$ cat *
('[email protected]', 'Alberto', 'Bonsanto')
('[email protected]', 'Miguel', 'Bonsanto')
('[email protected]', 'Stranger', 'Weirdo')
('[email protected]', 'Dakota', 'Bonsanto')
7
Alberto Bonsanto

La réponse correcte à cette question est que saveAsTextFile ne vous permet pas de nommer le fichier réel.

La raison en est que les données sont partitionnées et que, dans le chemin donné en tant que paramètre à l'appel de saveAsTextFile(...), il le considère comme un répertoire, puis écrit un fichier par partition.

Vous pouvez appeler rdd.coalesce(1).saveAsTextFile('/some/path/somewhere') et il va créer /some/path/somewhere/part-0000.txt.

Si vous avez besoin de plus de contrôle, vous devrez effectuer une opération de fichier après avoir effectué une rdd.collect().

Notez que toutes les données seront rassemblées dans un exécuteur, ce qui vous évitera des problèmes de mémoire. C'est le risque que vous prenez.

7
nod

Il n'est pas possible de nommer le fichier comme @nod dit. Cependant, il est possible de renommer le fichier juste après. Un exemple utilisant PySpark:

sc._jsc.hadoopConfiguration().set(
    "mapred.output.committer.class",
    "org.Apache.hadoop.mapred.FileOutputCommitter")
URI = sc._gateway.jvm.Java.net.URI
Path = sc._gateway.jvm.org.Apache.hadoop.fs.Path
FileSystem = sc._gateway.jvm.org.Apache.hadoop.fs.FileSystem
fs = FileSystem.get(URI("s3://{bucket_name}"), sc._jsc.hadoopConfiguration())
file_path = "s3://{bucket_name}/processed/source={source_name}/year={partition_year}/week={partition_week}/"
# remove data already stored if necessary
fs.delete(Path(file_path))

df.saveAsTextFile(file_path, compressionCodecClass="org.Apache.hadoop.io.compress.GzipCodec")

# rename created file
created_file_path = fs.globStatus(Path(file_path + "part*.gz"))[0].getPath()
fs.rename(
    created_file_path,
    Path(file_path + "{desired_name}.jl.gz"))
2
Juan Riaza