2017-02-13 65 views
1

我有一個案例類這樣的:星火的.csv列viariable數

case class ResultDays (name: String, number: Double, values: Double*) 

,我想將它保存到一個文件.csv

resultRDD.toDF() 
    .coalesce(1) 
    .write.format("com.databricks.spark.csv") 
    .option("header", "true") 
    .save("res/output/result.csv") 

不幸的是我有這樣的錯誤:

java.lang.UnsupportedOperationException: CSV data source does not support array<double> data type. 

那麼,如何插入可變數字values並將其保存到.csv

+0

CSV,作爲_format_,不支持可變數量的值,在這個意義上,所有記錄必須具有相同的列。你知道預計值的數量嗎?也許'values'成員可能擁有_maximum_個數值? –

+0

我必須爲每一行編寫相同數量的'values',但我不知道在運行之前有多少個'values'。 –

+0

確定 - 但是一旦你有'resultRDD',你可以假設所有的記錄都有相同數量的值? –

回答

1

如果你能承擔所有記錄resultRDDvalues相同數量的列 - 你可以閱讀first()記錄,用它來確定值的陣列中的數量,以及這些陣列轉換成單獨的列:

// determine number of "extra" columns: 
val extraCols = resultRDD.first().values.size 

// create a sequence of desired columns: 
val columns = Seq($"name", $"number") ++ (1 to extraCols).map(i => $"values"(i - 1) as s"col$i") 

// select the above columns before saving: 
resultRDD.toDF() 
    .select(columns: _*) 
    .coalesce(1) 
    .write.format("com.databricks.spark.csv") 
    .option("header", "true") 
    .save("res/output/result.csv") 

例CSV結果會是這樣的:

name,number,col1,col2 
a,0.1,0.01,0.001 
b,0.2,0.02,0.002 
c,0.3,0.03,0.003 
+0

它的作品像一個魅力,謝謝 –