web-dev-qa-db-fra.com

Spark - charge le fichier CSV en tant que DataFrame?

Je voudrais lire un CSV dans spark et le convertir en tant que DataFrame et le stocker dans HDFS avec df.registerTempTable("table_name") 

J'ai essayé:

scala> val df = sqlContext.load("hdfs:///csv/file/dir/file.csv")

Erreur que j'ai eu:

Java.lang.RuntimeException: hdfs:///csv/file/dir/file.csv is not a Parquet file. expected magic number at tail [80, 65, 82, 49] but found [49, 59, 54, 10]
    at parquet.hadoop.ParquetFileReader.readFooter(ParquetFileReader.Java:418)
    at org.Apache.spark.sql.parquet.ParquetRelation2$MetadataCache$$anonfun$refresh$6.apply(newParquet.scala:277)
    at org.Apache.spark.sql.parquet.ParquetRelation2$MetadataCache$$anonfun$refresh$6.apply(newParquet.scala:276)
    at scala.collection.parallel.mutable.ParArray$Map.leaf(ParArray.scala:658)
    at scala.collection.parallel.Task$$anonfun$tryLeaf$1.apply$mcV$sp(Tasks.scala:54)
    at scala.collection.parallel.Task$$anonfun$tryLeaf$1.apply(Tasks.scala:53)
    at scala.collection.parallel.Task$$anonfun$tryLeaf$1.apply(Tasks.scala:53)
    at scala.collection.parallel.Task$class.tryLeaf(Tasks.scala:56)
    at scala.collection.parallel.mutable.ParArray$Map.tryLeaf(ParArray.scala:650)
    at scala.collection.parallel.AdaptiveWorkStealingTasks$WrappedTask$class.compute(Tasks.scala:165)
    at scala.collection.parallel.AdaptiveWorkStealingForkJoinTasks$WrappedTask.compute(Tasks.scala:514)
    at scala.concurrent.forkjoin.RecursiveAction.exec(RecursiveAction.Java:160)
    at scala.concurrent.forkjoin.ForkJoinTask.doExec(ForkJoinTask.Java:260)
    at scala.concurrent.forkjoin.ForkJoinPool$WorkQueue.runTask(ForkJoinPool.Java:1339)
    at scala.concurrent.forkjoin.ForkJoinPool.runWorker(ForkJoinPool.Java:1979)
    at scala.concurrent.forkjoin.ForkJoinWorkerThread.run(ForkJoinWorkerThread.Java:107)

Quelle est la bonne commande pour charger un fichier CSV en tant que DataFrame dans Apache Spark?

95
Donbeo

spark-csv fait partie de la fonctionnalité principale de Spark et ne nécessite pas de bibliothèque séparée. Vous pouvez donc faire par exemple 

df = spark.read.format("csv").option("header", "true").load("csvfile.csv")
111
Shyamendra Solanki

analyser CSV en tant que DataFrame/DataSet avec Spark 2.x

Initialisez d'abord l'objet SparkSession/ par défaut, il sera disponible dans les shells sous la forme spark 

val spark = org.Apache.spark.sql.SparkSession.builder
        .master("local")
        .appName("Spark CSV Reader")
        .getOrCreate;

Utilisez l’une des méthodes suivantes pour charger CSV au format DataFrame/DataSet

1. Faites-le de manière programmatique

 val df = spark.read
         .format("csv")
         .option("header", "true") //first line in file has headers
         .option("mode", "DROPMALFORMED")
         .load("hdfs:///csv/file/dir/file.csv")

2. Vous pouvez aussi utiliser cette méthode SQL

 val df = spark.sql("SELECT * FROM csv.`hdfs:///csv/file/dir/file.csv`")

Dépendances:

 "org.Apache.spark" % "spark-core_2.11" % 2.0.0,
 "org.Apache.spark" % "spark-sql_2.11" % 2.0.0,


Version Spark <2.0

val df = sqlContext.read
    .format("com.databricks.spark.csv")
    .option("header", "true") 
    .option("mode", "DROPMALFORMED")
    .load("csv/file/path"); 

Dépendances:

"org.Apache.spark" % "spark-sql_2.10" % 1.6.0,
"com.databricks" % "spark-csv_2.10" % 1.6.0,
"com.univocity" % "univocity-parsers" % LATEST,
134
mrsrinivas

C'est pour qui Hadoop est 2.6 et Spark est 1.6 et sans paquet "databricks".

import org.Apache.spark.sql.types.{StructType,StructField,StringType,IntegerType};
import org.Apache.spark.sql.Row;

val csv = sc.textFile("/path/to/file.csv")
val rows = csv.map(line => line.split(",").map(_.trim))
val header = rows.first
val data = rows.filter(_(0) != header(0))
val rdd = data.map(row => Row(row(0),row(1).toInt))

val schema = new StructType()
    .add(StructField("id", StringType, true))
    .add(StructField("val", IntegerType, true))

val df = sqlContext.createDataFrame(rdd, schema)
13
Eric Yiwei Liu

Avec Spark 2.0, voici comment lire le fichier CSV

val conf = new SparkConf().setMaster("local[2]").setAppName("my app")
val sc = new SparkContext(conf)
val sparkSession = SparkSession.builder
  .config(conf = conf)
  .appName("spark session example")
  .getOrCreate()

val path = "/Users/xxx/Downloads/usermsg.csv"
val base_df = sparkSession.read.option("header","true").
  csv(path)
10
penny chan

En Java 1.8 Cet extrait de code fonctionne parfaitement pour lire des fichiers CSV 

POM.xml 

<dependency>
    <groupId>org.Apache.spark</groupId>
    <artifactId>spark-core_2.11</artifactId>
    <version>2.0.0</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.Apache.spark/spark-sql_2.10 -->
<dependency>
    <groupId>org.Apache.spark</groupId>
    <artifactId>spark-sql_2.10</artifactId>
    <version>2.0.0</version>
</dependency>

<!-- https://mvnrepository.com/artifact/org.scala-lang/scala-library -->
<dependency>
    <groupId>org.scala-lang</groupId>
    <artifactId>scala-library</artifactId>
    <version>2.11.8</version>
</dependency>
<dependency>
    <groupId>com.databricks</groupId>
    <artifactId>spark-csv_2.10</artifactId>
    <version>1.4.0</version>
</dependency>

Java 

SparkConf conf = new SparkConf().setAppName("JavaWordCount").setMaster("local");
// create Spark Context
SparkContext context = new SparkContext(conf);
// create spark Session
SparkSession sparkSession = new SparkSession(context);

Dataset<Row> df = sparkSession.read().format("com.databricks.spark.csv").option("header", true).option("inferSchema", true).load("hdfs://localhost:9000/usr/local/hadoop_data/loan_100.csv");

        //("hdfs://localhost:9000/usr/local/hadoop_data/loan_100.csv");
System.out.println("========== Print Schema ============");
df.printSchema();
System.out.println("========== Print Data ==============");
df.show();
System.out.println("========== Print title ==============");
df.select("title").show();
7
Rajeev Rathor

L’exemple de Penny Spark 2 est le moyen de le faire dans spark2. Il y a encore une astuce: avoir cet en-tête généré pour vous en effectuant une analyse initiale des données, en définissant l'option inferSchema sur true

Dans ce cas, supposons que spark est une session spark que vous avez configurée. Il s'agit de l'opération de chargement dans le fichier d'index CSV de toutes les images Landsat sur lesquelles Amazon Host est installé sur S3.

  /*
   * Licensed to the Apache Software Foundation (ASF) under one or more
   * contributor license agreements.  See the NOTICE file distributed with
   * this work for additional information regarding copyright ownership.
   * The ASF licenses this file to You under the Apache License, Version 2.0
   * (the "License"); you may not use this file except in compliance with
   * the License.  You may obtain a copy of the License at
   *
   *    http://www.Apache.org/licenses/LICENSE-2.0
   *
   * Unless required by applicable law or agreed to in writing, software
   * distributed under the License is distributed on an "AS IS" BASIS,
   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
   * See the License for the specific language governing permissions and
   * limitations under the License.
   */

val csvdata = spark.read.options(Map(
    "header" -> "true",
    "ignoreLeadingWhiteSpace" -> "true",
    "ignoreTrailingWhiteSpace" -> "true",
    "timestampFormat" -> "yyyy-MM-dd HH:mm:ss.SSSZZZ",
    "inferSchema" -> "true",
    "mode" -> "FAILFAST"))
  .csv("s3a://landsat-pds/scene_list.gz")

La mauvaise nouvelle est que cela déclenche une analyse du fichier. pour quelque chose de gros comme ce fichier CSV compressé de 20 Mo ou plus, cela peut prendre 30 secondes avec une connexion longue distance. Gardez cela à l'esprit: il est préférable de coder manuellement le schéma une fois que vous l'avez reçu.

(extrait de code sous licence Apache Software License 2.0 pour éviter toute ambiguïté; ce que j'ai fait comme test de démonstration/d'intégration de l'intégration S3)

4
Steve Loughran

Charge un fichier CSV et renvoie le résultat sous forme de DataFrame.

df=sparksession.read.option("header", true).csv("file_name.csv")

Dataframe a traité un fichier au format csv.

0
Sri

Si vous construisez un bocal avec Scala 2.11 et Apache 2.0 ou supérieur.

Il n'est pas nécessaire de créer un objet sqlContext ou sparkContext. Seul un objet SparkSession suffit pour répondre à tous les besoins.

Voici mon code qui fonctionne bien:

import org.Apache.spark.sql.{DataFrame, Row, SQLContext, SparkSession}
import org.Apache.log4j.{Level, LogManager, Logger}

object driver {

  def main(args: Array[String]) {

    val log = LogManager.getRootLogger

    log.info("**********JAR EXECUTION STARTED**********")

    val spark = SparkSession.builder().master("local").appName("ValidationFrameWork").getOrCreate()
    val df = spark.read.format("csv")
      .option("header", "true")
      .option("delimiter","|")
      .option("inferSchema","true")
      .load("d:/small_projects/spark/test.pos")
    df.show()
  }
}

Si vous utilisez un cluster, remplacez simplement .master("local") par .master("yarn") lors de la définition de l'objet sparkBuilder.

Le Spark Doc couvre ceci: https://spark.Apache.org/docs/2.2.0/sql-programming-guide.html

0
swapnil shashank

Essayez ceci si vous utilisez spark 2.0+

For non-hdfs file:
df = spark.read.csv("file:///csvfile.csv")


For hdfs file:
df = spark.read.csv("hdfs:///csvfile.csv")

For hdfs file (with different delimiter than comma:
df = spark.read.option("delimiter","|")csv("hdfs:///csvfile.csv")

Remarque: - ceci fonctionne pour tout fichier délimité. Utilisez simplement l'option (“délimiteur”,) pour changer la valeur.

J'espère que c'est utile.

0
user11714872

L'analyse d'un fichier CSV pose de nombreux problèmes. Elle s'additionne continuellement si la taille du fichier est plus grande, s'il existe des caractères autres que l'anglais/escape/separator/other dans les valeurs de colonne, susceptibles de provoquer des erreurs d'analyse.

La magie réside alors dans les options utilisées. Ceux qui ont fonctionné pour moi et qui devraient couvrir la plupart des cas Edge sont décrits dans le code ci-dessous:

### Create a Spark Session
spark = SparkSession.builder.master("local").appName("Classify Urls").getOrCreate()

### Note the options that are used. You may have to Tweak these in case of error
html_df = spark.read.csv(html_csv_file_path, 
                         header=True, 
                         multiLine=True, 
                         ignoreLeadingWhiteSpace=True, 
                         ignoreTrailingWhiteSpace=True, 
                         encoding="UTF-8",
                         sep=',',
                         quote='"', 
                         escape='"',
                         maxColumns=2,
                         inferSchema=True)

J'espère que cela pourra aider. Pour plus de détails, consultez: Utilisation de PySpark 2 pour lire un fichier CSV contenant du code source HTML

Remarque: Le code ci-dessus provient de l'API Spark 2, où l'API de lecture de fichier CSV est fournie avec des packages intégrés d'installation Spark.

Remarque: PySpark est un wrapper Python pour Spark et partage la même API que Scala/Java.

0
karthiks

Le format de fichier par défaut est Parquet with spark.read .. et le fichier csv qui explique pourquoi vous obtenez une exception. Spécifiez le format CSV avec l'API que vous essayez d'utiliser

0
tazak