2017-04-02 6 views
2

Ich habe die folgende Fallklasse:Explicit Besetzung mit Fallklasse Funken Lesen .csv 2.1.0

case class OrderDetails(OrderID : String, ProductID : String, UnitPrice : Double, 
        Qty : Int, Discount : Double) 

Ich versuche, diese csv lesen: https://github.com/xsankar/fdps-v3/blob/master/data/NW-Order-Details.csv

Dies ist mein Code:

val spark = SparkSession.builder.master(sparkMaster).appName(sparkAppName).getOrCreate() 
import spark.implicits._ 
val orderDetails = spark.read.option("header","true").csv(inputFiles + "NW-Order-Details.csv").as[OrderDetails] 

Und der Fehler ist:

Exception in thread "main" org.apache.spark.sql.AnalysisException: 
Cannot up cast `UnitPrice` from string to double as it may truncate 
The type path of the target object is: 
    - field (class: "scala.Double", name: "UnitPrice") 
    - root class: "es.own3dh2so4.OrderDetails" 
You can either add an explicit cast to the input data or choose a higher precision type of the field in the target object; 

Warum kann es nicht transformiert werden, wenn alle Felder "Doppel" -Werte sind? Was versteh ich nicht?

Spark-Version 2.1.0, Scala Version 2.11.7

Antwort

6

Sie müssen nur explizit auf ein Feld Ihres Double würfe

val orderDetails = spark.read 
    .option("header","true") 
    .csv(inputFiles + "NW-Order-Details.csv") 
    .withColumn("unitPrice", 'UnitPrice.cast(DoubleType)) 
    .as[OrderDetails] 

Auf einer Seite zur Kenntnis, von Scala (und Java) Konvention Ihr Fall Klassenkonstruktors Parameter niedriger Kamel Fall sein sollte:

case class OrderDetails(orderID: String, 
         productID: String, 
         unitPrice: Double, 
         qty: Int, 
         discount: Double) 
+0

Danke für die Antwort, ich habe gerade die folgende Eigenschaft, die passieren können und folgert Sie alle Felder 'Option („InferSchema“," t rue ")". Über Scala convention Ich benutzte oberen camel case, weil benötigt wird, weil der csv-Header Großbuchstaben ist – own3dh2so4

+0

Meiner Erfahrung nach funktioniert das nur manchmal für diese Situation. Wenn das alles ist, ist das cool. – Vidya

+1

Was die Konvention betrifft, gibt es viele Möglichkeiten, zum Beispiel, indem Sie die Spalten so benennen, wie sie wollen, dass sie 'toDf' verwenden. Aber ich kann sehen, warum sich das wie unnötige Arbeit anfühlt. Ich persönlich bin gerade bei Konventionen sehr groß - vor allem bei professionellen Projekten, so dass mein Code statische Analysetests und Codeüberprüfungen besteht. – Vidya