web-dev-qa-db-fra.com

Comment lire seulement n lignes d'un fichier CSV volumineux sur HDFS à l'aide du package spark-csv?

J'ai un gros fichier distribué sur HDFS et chaque fois que j'utilise sqlContext avec le paquet spark-csv, il charge tout le fichier, ce qui prend un certain temps.

df = sqlContext.read.format('com.databricks.spark.csv').options(header='true', inferschema='true').load("file_path")

maintenant, comme je veux juste faire quelques vérifications rapides de temps en temps, tout ce dont j'ai besoin est de quelques/n rangs du fichier entier.

df_n = sqlContext.read.format('com.databricks.spark.csv').options(header='true', inferschema='true').load("file_path").take(n)
df_n = sqlContext.read.format('com.databricks.spark.csv').options(header='true', inferschema='true').load("file_path").head(n)

mais tous ces courent après le chargement du fichier. Puis-je simplement limiter le nombre de lignes lors de la lecture du fichier lui-même? Je me réfère à n_rows équivalent de pandas dans spark-csv, comme:

pd_df = pandas.read_csv("file_path", nrows=20)

Ou bien, spark pourrait ne pas charger le fichier, la première étape, mais dans ce cas, pourquoi l'étape de chargement de mon fichier prend-elle trop de temps?

Je voudrais

df.count()

ne me donner que n et pas toutes les lignes, est-ce possible?

8
Abhishek

Vous pouvez utiliser limit(n)

sqlContext.format('com.databricks.spark.csv') \
          .options(header='true', inferschema='true').load("file_path").limit(20)

Cela ne fera que charger 20 lignes. 

11
eliasah

D'après ce que je comprends, le module spark-csv ne prend pas directement en charge la lecture. Il suffit de lire workaround pour lire le fichier sous forme de fichier texte, prendre autant de lignes que vous le souhaitez et l'enregistrer emplacement temporaire. Avec les lignes enregistrées, vous pouvez utiliser spark-csv pour les lire, y compris l’option inferSchema (que vous voudrez peut-être utiliser si vous êtes en mode exploration).

val numberOfLines = ...
spark.
  read.
  text("myfile.csv").
  limit(numberOfLines).
  write.
  text(s"myfile-$numberOfLines.csv")
val justFewLines = spark.
  read.
  option("inferSchema", true). // <-- you are in exploration mode, aren't you?
  csv(s"myfile-$numberOfLines.csv")
4
Jacek Laskowski

Ne pas déduire de schéma et utiliser limit(n) a fonctionné pour moi, dans tous les aspects.

f_schema = StructType([
StructField("col1",LongType(),True),
StructField("col2",IntegerType(),True),
StructField("col3",DoubleType(),True)
...
])

df_n = sqlContext.read.format('com.databricks.spark.csv').options(header='true').schema(f_schema).load(data_path).limit(10)

Note: / Si nous utilisons inferschema='true', c'est encore la même heure, et peut-être donc la même vieille chose.

Mais si nous avons une idée du schéma, les solutions de Jacek Laskowski fonctionnent également. :)

0
Abhishek