2017-04-02 54 views
2

我有以下情況下類:明確的轉換閱讀的.csv與案例類星火2.1.0

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

我想讀這CSV:https://github.com/xsankar/fdps-v3/blob/master/data/NW-Order-Details.csv

這是我的代碼:

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] 

和錯誤是:

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; 

如果所有字段都是「雙」值,爲什麼不能進行轉換?我不明白什麼?

星火版本2.1.0,斯卡拉版本2.11.7

回答

6

你只需要你的領域明確地轉換爲Double

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

在一個側面說明,由斯卡拉(和Java)會議,你的情況類的構造函數的參數應該是較低的駱駝情況:

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

感謝您的答覆,我剛剛發現以下屬性,可以發生在你和你推斷的所有字段'選項(「則InferSchema」,「T街「)'。 關於Scala convenions我使用了上層駱駝案例,因爲需要,因爲csv頭是大寫 – own3dh2so4

+0

根據我的經驗,這隻有時適用於這種情況。如果這一切都需要,那很酷。 – Vidya

+1

至於約定的事情,有很多方法 - 例如,通過命名列,因爲你希望他們使用'toDf'。但我可以看到爲什麼這感覺像不必要的忙碌。我個人在會議上非常重要 - 特別是專業項目,所以我的代碼通過了靜態分析測試和代碼評論。 – Vidya