it-roy-ru.com

Spark - загрузить CSV-файл как DataFrame?

Я хотел бы прочитать CSV в спарк и преобразовать его в DataFrame и сохранить его в HDFS с df.registerTempTable("table_name") 

Я пытался:

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

Ошибка, которую я получил:

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)

Какова правильная команда для загрузки файла CSV как DataFrame в Apache Spark?

95
Donbeo

spark-csv является частью основной функциональности Spark и не требует отдельной библиотеки. Так что вы могли бы просто сделать, например, 

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

проанализировать CSV как DataFrame/DataSet с Spark 2.x

Сначала инициализируйте SparkSession объект по умолчанию он будет доступен в оболочках как spark 

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

Используйте любой из следующих способов, чтобы загрузить CSV как DataFrame/DataSet

1. Сделайте это программным способом

 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. Вы также можете сделать это SQL

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

Зависимости:

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


Версия Spark <2.0

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

Зависимости:

"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

Это для которого Hadoop 2.6 и Spark 1.6 и без пакета "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

В Spark 2.0 вы можете читать 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

В Java 1.8 этот фрагмент кода отлично работает для чтения файлов 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>

Джава 

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

Пример Пенни Spark 2 - это способ сделать это в spark2. Есть еще одна хитрость: сгенерируйте этот заголовок для вас, выполнив первоначальное сканирование данных, установив для параметра inferSchema значение true

Далее, если предположить, что spark - это настроенный вами сеанс искры, это операция загрузки в индексный файл CSV всех образов Landsat, которые Amazon Host на 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")

Плохие новости: это запускает сканирование файла; для чего-то большого, такого как сжатый CSV-файл объемом 20 МБ, который может занять 30 секунд при длительном соединении. Имейте это в виду: вам лучше вручную закодировать схему, как только она появится.

(фрагмент кода Apache Software License 2.0 лицензирован, чтобы избежать двусмысленности; то, что я сделал в качестве демонстрационного/интеграционного теста интеграции S3)

4
Steve Loughran

Загружает файл CSV и возвращает результат в виде DataFrame.

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

Датафрейм рассматривал файл как формат csv.

0
Sri

В случае, если вы строите банку с Scala 2.11 и Apache 2.0 или выше.

Нет необходимости создавать объект sqlContext или sparkContext. Просто объект SparkSession удовлетворяет требованиям для всех нужд.

Ниже приведен мой код, который работает нормально:

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()
  }
}

Если вы работаете в кластере, просто измените .master("local") на .master("yarn") при определении объекта sparkBuilder

Документ Spark покрывает это: https://spark.Apache.org/docs/2.2.0/sql-programming-guide.html

0
swapnil shashank

Есть много проблем с анализом CSV-файла, он продолжает складываться, если размер файла больше, если в значениях столбца есть неанглийские/escape/separator/другие символы, которые могут вызвать ошибки синтаксического анализа.

Магия тогда заключается в опциях, которые используются. Те, что работали для меня и, надеюсь, должны охватывать большинство случаев Edge, приведены в коде ниже:

### 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)

Надеюсь, это поможет. Для получения дополнительной информации: Использование PySpark 2 для чтения CSV с исходным кодом HTML

Примечание. Приведенный выше код взят из API Spark 2, где API чтения файлов CSV поставляется в комплекте со встроенными пакетами устанавливаемого Spark.

Примечание: PySpark - это оболочка Python для Spark и использует тот же API, что и Scala/Java.

0
karthiks

Формат файла по умолчанию - Parquet с spark.read .. и чтением файла csv, поэтому вы получаете исключение. Укажите формат CSV с API, который вы пытаетесь использовать

0
tazak