web-dev-qa-db-fra.com

Différence entre sc.textFile et spark.read.text dans Spark

J'essaie de lire un simple fichier texte dans un RDD Spark et je vois qu'il y a deux façons de le faire:

from pyspark.sql import SparkSession
spark = SparkSession.builder.master("local[*]").getOrCreate()
sc = spark.sparkContext
textRDD1 = sc.textFile("hobbit.txt")
textRDD2 = spark.read.text('hobbit.txt').rdd

puis je regarde les données et je vois que les deux RDD sont structurés différemment

textRDD1.take(5)

['The king beneath the mountain',
 'The king of carven stone',
 'The lord of silver fountain',
 'Shall come unto his own',
 'His throne shall be upholden']

textRDD2.take(5)

[Row(value='The king beneath the mountain'),
 Row(value='The king of carven stone'),
 Row(value='The lord of silver fountain'),
 Row(value='Shall come unto his own'),
 Row(value='His throne shall be upholden')]

Sur cette base, tous les traitements ultérieurs doivent être modifiés pour refléter la présence de la "valeur"

Mes questions sont

  • Quelle est l'implication de ces deux manières de lire un fichier texte?
  • Dans quelles circonstances devrions-nous utiliser quelle méthode?
6
Calcutta

Pour répondre (a),

sc.textFile(...) renvoie un RDD[String]

textFile(String path, int minPartitions)

Lisez un fichier texte depuis HDFS, un système de fichiers local (disponible sur tous les nœuds) ou tout URI de système de fichiers pris en charge par Hadoop et renvoyez-le en tant que RDD de chaînes.

spark.read.text(...) renvoie un DataSet[Row] ou un DataFrame

text(String path)

Charge les fichiers texte et renvoie un DataFrame dont le schéma commence par une colonne de chaîne nommée "valeur", et suivie par des colonnes partitionnées s'il y en a.

Pour (b), cela dépend vraiment de votre cas d'utilisation. Puisque vous essayez de créer un RDD ici, vous devriez utiliser sc.textFile. Vous pouvez toujours convertir une trame de données en disque dur et vice-versa.

12
philantrovert