2017-02-13 3 views
1

私はそのようなケースクラスがあります。スパーク.CSV viariable数は

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

を、私は

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

は、残念ながら、私はこのエラーを持っている.csvファイルにそれを保存したい:

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

可変番号valuesを挿入して.csvに保存するにはどうすればよいですか?

+0

CSV、_format_として、すべてのレコードが同じ列を持たなければならないという意味で、値の可変数をサポートしていません。予想される価値の数について何か知っていますか?おそらく、valueメンバーが持つ可能性のある_maximum_個の値ですか? –

+0

私はすべての行に同じ数の 'values'を書いていますが、実行する前にいくつの' values'があるのか​​分かりません。 –

+0

OKですが、いったん 'resultRDD'を取れば、すべてのレコードが同じ数の値を持つとみなすことができます。 –

答えて

1

valuesに同じ数の列を持っているresultRDDに、あなたはすべてのレコードを想定することができる場合 - あなたは、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

魅力のように動作します、ありがとう –

関連する問題