Spark-загрузить CSV-файл в качестве фрейма данных?
Я хотел бы прочитать CSV в spark и преобразовать его в виде фрейма данных и сохранить его в 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.apply(newParquet.scala:277)
at org.apache.spark.sql.parquet.ParquetRelation2$MetadataCache$$anonfun$refresh.apply(newParquet.scala:276)
at scala.collection.parallel.mutable.ParArray$Map.leaf(ParArray.scala:658)
at scala.collection.parallel.Task$$anonfun$tryLeaf.apply$mcV$sp(Tasks.scala:54)
at scala.collection.parallel.Task$$anonfun$tryLeaf.apply(Tasks.scala:53)
at scala.collection.parallel.Task$$anonfun$tryLeaf.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-файла в качестве фрейма данных в Apache Spark?
8 ответов:
spark-csv является частью основной функциональности Spark и не требует отдельной библиотеки. Так что вы могли бы просто сделать, например
df = spark.read.format("csv").option("header", "true").load("csvfile.csv")
разбор CSV в качестве фрейма данных / набора данных с помощью Spark 2.x
инициализации
SparkSessionобъект по умолчанию он будет доступен в раковинах какsparkval spark = org.apache.spark.sql.SparkSession.builder .master("local") .appName("Spark CSV Reader") .getOrCreate;используйте любой из следующих способов загрузки CSV как
DataFrame/DataSet1. Сделайте это программно
val df = spark.read .format("csv") .option("header", "true") //reading the headers .option("mode", "DROPMALFORMED") .load("hdfs:///csv/file/dir/file.csv")2. вы можете сделать это в SQL как ну
val df = spark.sql("SELECT * FROM csv.`csv/file/path/in/hdfs`")зависимости:
"org.apache.spark" % "spark-core_2.11" % 2.0.0, "org.apache.spark" % "spark-sql_2.11" % 2.0.0,
Spark version
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,
С 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)
это для которого 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)
в Java 1.8 этот фрагмент кода отлично работает для чтения CSV-файлов
пом.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();
пример Пенни Spark 2-это способ сделать это в spark2. Есть еще один трюк: создайте этот заголовок для вас, выполнив начальное сканирование данных, установив опцию
inferSchematotrueвот, допустим, что
sparkэто сеанс spark, который вы настроили, это операция загрузки в индексный файл CSV всех изображений Landsat, которые amazon размещает на 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")плохая новость: это вызывает сканирование через файл; для чего-то большого как этот 20 + MB zipped CSV-файл, который может занять 30 секунд в течение длительного времени соединения. Имейте это в виду: вам лучше вручную кодировать схему, как только вы ее получите.
(фрагмент кода Apache Software License 2.0 лицензирован, чтобы избежать всякой двусмысленности; что-то я сделал в качестве демонстрационного/интеграционного теста интеграции S3)
формат файла по умолчанию-паркет с искрой.читать.. и файл чтения csv, поэтому вы получаете исключение. Укажите формат csv с помощью api, который вы пытаетесь использовать
есть много проблем с разбором CSV-файла, он продолжает складываться, если размер файла больше, если в значениях столбцов есть неанглийские/escape/separator/другие символы, которые могут вызвать ошибки разбора.
магия тогда находится в параметрах, которые используются. Те, которые работали для меня и надеюсь, должны охватывать большинство крайних случаев в коде ниже:
### 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-источником код
Примечание: приведенный выше код из Spark 2 API, где CSV-файл чтения API поставляется в комплекте со встроенными пакетами Spark installable.
Примечание: PySpark-это оболочка Python для Spark и использует тот же API, что и Scala/Java.
Comments