स्पार्क - CSV फ़ाइल को DataFrame के रूप में लोड करें?


141

मैं स्पार्क में एक सीएसवी पढ़ना चाहूंगा और इसे डेटाफ्रेम के रूप में परिवर्तित करूंगा और इसे एचडीएफएस में स्टोर करूंगा 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)

Apache Spark में CSF फ़ाइल को DataFrame के रूप में लोड करने के लिए सही कमांड क्या है?


जवाबों:


180

स्पार्क-सीएसवी कोर स्पार्क कार्यक्षमता का हिस्सा है और इसके लिए अलग लाइब्रेरी की आवश्यकता नहीं है। तो आप सिर्फ उदाहरण के लिए कर सकते हैं

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

स्काला में, (यह किसी भी प्रारूप में परिसीमन का उल्लेख करता है "," सीएसवी के लिए, "टी / टी वी आदि के लिए")

val df = sqlContext.read.format("com.databricks.spark.csv") .option("delimiter", ",") .load("csvfile.csv")


163

CSV को पार्स करें और स्पार्क 2.x के साथ डेटाफ्रेम / डेटासेट के रूप में लोड करें

पहले, डिफ़ॉल्ट रूप सेSparkSession ऑब्जेक्ट को इनिशियलाइज़ करें जो कि शेल में उपलब्ध होगाspark

val spark = org.apache.spark.sql.SparkSession.builder
        .master("local") # Change it as per your cluster
        .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")

अपडेट: भविष्य में लिंक टूट जाने की स्थिति में यहां से सभी विकल्पों को जोड़ना

  • पथ : फ़ाइलों का स्थान। स्पार्क के समान ही मानक हडॉप ग्लोबिंग एक्सप्रेशन स्वीकार कर सकते हैं।
  • हैडर : जब सही पर सेट किया जाता है तो फ़ाइलों की पहली पंक्ति का उपयोग स्तंभों को नाम देने के लिए किया जाएगा और डेटा में शामिल नहीं किया जाएगा। सभी प्रकारों को स्ट्रिंग माना जाएगा। मूल मूल्य गलत है।
  • सीमांकक : डिफ़ॉल्ट कॉलम का उपयोग करके सीमांकित किया जाता है, लेकिन सीमांकक को किसी भी वर्ण में सेट किया जा सकता है
  • उद्धरण : डिफ़ॉल्ट रूप से उद्धरण चरित्र "है, लेकिन किसी भी वर्ण पर सेट किया जा सकता है। उद्धरण के अंदर परिसीमन को अनदेखा किया जाता है
  • पलायन : डिफ़ॉल्ट रूप से, बच चरित्र है, लेकिन किसी भी चरित्र के लिए सेट किया जा सकता है। बच गए उद्धरण पात्रों को नजरअंदाज कर दिया जाता है
  • parserLib : डिफ़ॉल्ट रूप से, यह " कॉमन्स " है जिसे "सेट" किया जा सकता है CSV पार्सिंग के लिए उस लाइब्रेरी का उपयोग करने के univocity " पर ।
  • मोड : पार्सिंग मोड को निर्धारित करता है। डिफ़ॉल्ट रूप से यह PERMISSIVE है। संभावित मूल्य हैं:
    • अनुमोदक : सभी लाइनों को पार्स करने की कोशिश करता है: गायब टोकन के लिए नल डाले जाते हैं और अतिरिक्त टोकन को नजरअंदाज कर दिया जाता है।
    • DROPMALFORMED : उन रेखाओं को छोड़ देता है जिनमें अपेक्षा से कम या अधिक टोकन होते हैं जो स्कीमा से मेल नहीं खाते हैं
    • FAILFAST : यदि किसी विकृत लाइन चारसेट से सामना होता है, तो RuntimeException के साथ गर्भपात : 'UTF-8' के लिए चूक लेकिन अन्य वैध चारसेट नाम पर सेट किया जा सकता है
  • inferSchema : स्वचालित रूप से स्तंभ प्रकार को । यह डेटा पर एक अतिरिक्त पास की आवश्यकता है और डिफ़ॉल्ट टिप्पणी द्वारा गलत है: इस चरित्र के साथ शुरू होने वाली रेखाएं छोड़ें। डिफ़ॉल्ट "#" है। अशक्त करने के लिए यह सेट करके टिप्पणियों को अक्षम करें।
  • nullValue : एक स्ट्रिंग निर्दिष्ट करता है जो एक शून्य मान को इंगित करता है, इस स्ट्रिंग से मेल खाने वाले किसी भी फ़ील्ड को डेटाफ़्रेम में नल के रूप में सेट किया जाएगा
  • dateFormat : एक स्ट्रिंग निर्दिष्ट करता है जो दिनांक या टाइमस्टैम्प पढ़ते समय उपयोग करने के लिए दिनांक प्रारूप को इंगित करता है। कस्टम दिनांक स्वरूप java.text.SimpleDateFormat पर स्वरूपों का अनुसरण करते हैं। यह DateType और TimestampType दोनों पर लागू होता है। डिफ़ॉल्ट रूप से, यह शून्य है जिसका अर्थ है कि java.sql.Timestamp.valueOf () और java.sql.Date.valueOf () द्वारा समय और तारीख को पार्स करने की कोशिश करना।

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,

स्पार्क संस्करण <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,

क्या इस सत्र में हाइव की आवश्यकता है? मुझे हाइव एरर मिल रहा है।
पुनीत

2
कोई जरुरत नहीं है। केवल spark-core_2.11और spark-sql_2.11के 2.0.1संस्करण ठीक है। यदि संभव हो तो त्रुटि संदेश जोड़ें।
मृगिनिवास

1
क्या हम एक पाइप सीमांकित फ़ाइल को डेटाफ्रेम में बदल सकते हैं?
ओंकार

3
@OmkarPuttagunta: हां, ऑफ कोर्स! कुछ इस तरह की कोशिश करो spark.read.format("csv").option("delimiter ", "|") ...
mrsrinivas

1
इसके लिए अन्य विकल्प programmatic wayको छोड़ना .format("csv")और बदलना .load(...है .csv(...। यह optionविधि DataFrameReader वर्ग से संबंधित है, क्योंकि readविधि द्वारा लौटाया जाता है , जहां loadऔर csvविधियां एक डेटाफ्रेम लौटाती हैं , इसलिए उन्हें कॉल किए जाने के बाद टैग किए गए विकल्प नहीं हो सकते। यह उत्तर बहुत अच्छी तरह से है, लेकिन आपको दस्तावेज़ीकरण से लिंक करना चाहिए ताकि लोग अन्य सभी CSV विकल्प स्पार्क पर उपलब्ध देख सकें ।apache.org/docs/latest/api/scala/… *): org.apache.spark.sqb.DataFrame
दावोस

17

यह जिसके लिए हैडॉप 2.6 है और स्पार्क 1.6 और "डेटाब्रीक्स" पैकेज के बिना है।

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)

12

स्पार्क 2.0 के साथ, निम्नलिखित है कि आप सीएसवी कैसे पढ़ सकते हैं

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)

5
क्या आपस में spark.read.csv(path)और कोई फर्क है spark.read.format("csv").load(path)?
एरिक

8

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

जबकि यह किसी के लिए उपयोगी हो सकता है। प्रश्न में एक स्काला टैग है।
OneCricketeer

5

CSV फ़ाइल को पार्स करने के लिए बहुत सारी चुनौतियाँ हैं, यदि फ़ाइल का आकार बड़ा है, यदि स्तंभ में गैर-अंग्रेजी / एस्केप / विभाजक / अन्य वर्ण हैं, तो यह जोड़ना जारी रखता है, जिससे पार्सिंग त्रुटियाँ हो सकती हैं।

फिर जादू उन विकल्पों में है जो उपयोग किए जाते हैं। मेरे और आशा के लिए काम करने वालों को किनारे के अधिकांश मामलों को कवर करना चाहिए जो नीचे दिए गए हैं:

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

उम्मीद है की वो मदद करदे। अधिक संदर्भ के लिए: CSV के HTML स्रोत कोड को पढ़ने के लिए PySpark 2 का उपयोग करना

नोट: उपरोक्त कोड स्पार्क 2 एपीआई से है, जहां सीएसवी फ़ाइल रीडिंग एपीआई स्पार्क इंस्टॉल करने योग्य के पैकेज के साथ बंडल में आता है।

नोट: पाइस्पार्क स्पार्क के लिए एक पायथन रैपर है और स्काला / जावा के समान ही एपीआई साझा करता है।



4

पेनी की स्पार्क 2 का उदाहरण स्पार्क 2 में करने का तरीका है। एक और तरकीब है: उस शीर्षलेख को आपके लिए डेटा का एक प्रारंभिक स्कैन करके, विकल्प के inferSchemaलिए सेटिंग करके उत्पन्न किया गया हैtrue

फिर, यह मानते हुए कि sparkआपके द्वारा स्थापित एक स्पार्क सत्र है, सभी लैंडसैट छवियों के सीएसवी सूचकांक फ़ाइल में लोड करने के लिए ऑपरेशन है जो एस 3 पर अमेज़ॅन होस्ट करता है।

  /*
   * 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 + एमबी ज़िप्ड CSV फ़ाइल की तरह कुछ के लिए, कि एक लंबी दौड़ कनेक्शन पर 30s ले सकते हैं। इस बात को ध्यान में रखते हुए: स्कीमा को कोड करने के बाद आप मैन्युअल रूप से कोडिंग करना बेहतर समझते हैं।

(कोड स्निपेट अपाचे सॉफ्टवेयर लाइसेंस 2.0 सभी अस्पष्टता से बचने के लिए लाइसेंस प्राप्त; कुछ मैंने S3 के डेमो / एकीकरण परीक्षण के रूप में किया है)


मैंने इस सीएसवी विधि या विकल्पों के लिए एक नक्शा पास नहीं देखा था। हमेशा स्पष्ट स्कीमा प्रदान करने से बेहतर है, inferSchema त्वरित n गंदे (उर्फ डेटा विज्ञान) के लिए ठीक है, लेकिन ETL के लिए भयानक है।
दावोस

2

मामले में आप 2.11 और अपाचे 2.0 या उच्चतर के साथ एक जार का निर्माण कर रहे हैं।

ऑब्जेक्ट sqlContextया sparkContextऑब्जेक्ट बनाने की कोई आवश्यकता नहीं है । बस एक SparkSessionवस्तु सभी आवश्यकताओं की आवश्यकता को पूरा करती है।

निम्नलिखित mycode है जो ठीक काम करता है:

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 वस्तु

स्पार्क डॉक्टर इसमें शामिल हैं: https://spark.apache.org/docs/2.2.0/sql-programming-guide.html


यह मौजूदा उत्तरों के समान है
mrsrinivas

0

POM फ़ाइल में निम्नलिखित स्पार्क निर्भरता जोड़ें:

<dependency>
    <groupId>org.apache.spark</groupId>
    <artifactId>spark-core_2.11</artifactId>
    <version>2.2.0</version>
</dependency>
<dependency>
    <groupId>org.apache.spark</groupId>
    <artifactId>spark-sql_2.11</artifactId>
    <version>2.2.0</version>
</dependency>

// स्पार्क कॉन्फ़िगरेशन:

वैल स्पार्क = स्पार्कसेशन.बिल्डर ()। मास्टर ("स्थानीय")। ऐपनाम ("नमूना ऐप")। getOrCreate ()।

// पढ़ें सीएसवी फ़ाइल:

वैल df = spark.read.option ("शीर्ष लेख", "सत्य")। csv ("FILE_PATH")

// आउटपुट प्रदर्शित करें

df.show ()


0

सिस्टम पर सापेक्ष पथ से पढ़ने के लिए वर्तमान निर्देशिका प्राप्त करने के लिए System.getProperty विधि का उपयोग करें और आगे के पथ का उपयोग करके फ़ाइल को लोड करने के लिए उपयोग करता है।

scala> val path = System.getProperty("user.dir").concat("/../2015-summary.csv")
scala> val csvDf = spark.read.option("inferSchema","true").option("header", "true").csv(path)
scala> csvDf.take(3)

स्पार्क: 2.4.4 स्केला: 2.11.12


0

स्पार्क 2.4+ के साथ, यदि आप एक स्थानीय निर्देशिका से सीएसवी लोड करना चाहते हैं, तो आप 2 सत्रों का उपयोग कर सकते हैं और इसे हाइव में लोड कर सकते हैं। पहला सत्र मास्टर () "स्थानीय [*]" के रूप में और दूसरा सत्र "यार्न" और हाइव सक्षम के साथ बनाया जाना चाहिए।

नीचे वाले ने मेरे लिए काम किया।

import org.apache.log4j.{Level, Logger}
import org.apache.spark._
import org.apache.spark.rdd._
import org.apache.spark.sql._

object testCSV { 

  def main(args: Array[String]) {
    Logger.getLogger("org").setLevel(Level.ERROR)
    val spark_local = SparkSession.builder().appName("CSV local files reader").master("local[*]").getOrCreate()

    import spark_local.implicits._
    spark_local.sql("SET").show(100,false)
    val local_path="/tmp/data/spend_diversity.csv"  // Local file
    val df_local = spark_local.read.format("csv").option("inferSchema","true").load("file://"+local_path) // "file://" is mandatory
    df_local.show(false)

    val spark = SparkSession.builder().appName("CSV HDFS").config("spark.sql.warehouse.dir", "/apps/hive/warehouse").enableHiveSupport().getOrCreate()

    import spark.implicits._
    spark.sql("SET").show(100,false)
    val df = df_local
    df.createOrReplaceTempView("lcsv")
    spark.sql(" drop table if exists work.local_csv ")
    spark.sql(" create table work.local_csv as select * from lcsv ")

   }

जब spark2-submit --master "yarn" --conf spark.ui.enabled=false testCSV.jarइसके साथ भाग गया तो ठीक चला गया और छत्ते में तालिका बनाई।


-1

डिफ़ॉल्ट फ़ाइल प्रारूप चंचल के साथ Parquet.read है .. और सीएसवी पढ़ने के लिए कि आपको अपवाद क्यों मिल रहा है। आप उपयोग करने की कोशिश कर रहे हैं एपीआई के साथ सीएसवी प्रारूप निर्दिष्ट करें


-1

अगर स्पार्क 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")

नोट: - यह किसी भी सीमांकित फ़ाइल के लिए काम करता है। मूल्य बदलने के लिए बस विकल्प ("सीमांकक") का उपयोग करें।

आशा है कि यह उपयोगी है।


यह मौजूदा उत्तरों के समान है
mrsrinivas

-1

इन-बिल्ट स्पार्क सीएसवी के साथ, आप इसे स्पार्क> 2.0 के लिए नई स्पार्कसेशन ऑब्जेक्ट के साथ आसानी से प्राप्त कर सकते हैं।

val df = spark.
        read.
        option("inferSchema", "false").
        option("header","true").
        option("mode","DROPMALFORMED").
        option("delimiter", ";").
        schema(dataSchema).
        csv("/csv/file/dir/file.csv")
df.show()
df.printSchema()

आपके द्वारा निर्धारित विभिन्न विकल्प हैं।

  • header: क्या आपकी फ़ाइल में शीर्ष पर हेडर लाइन शामिल है
  • inferSchema: क्या आप स्कीमा को स्वचालित रूप से बनाना चाहते हैं या नहीं। डिफ़ॉल्ट हैtrue । मैं हमेशा उचित डेटाैटिप्स सुनिश्चित करने के लिए स्कीमा प्रदान करना पसंद करता हूं।
  • mode: पार्सिंग मोड, PERMISSIVE, DROPMALFORMED या FAILFAST
  • delimiter: सीमांकक निर्दिष्ट करने के लिए, डिफ़ॉल्ट अल्पविराम है (',')
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.