2017-02-13 3 views
1

У меня есть дела класс вроде этого:Spark .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_, не поддерживает переменное количество значений, в том смысле, что все записи должны иметь одинаковые столбцы. Вы знаете что-нибудь о количестве ожидаемых значений? Может быть, _maximum_ количество значений, которые может иметь член 'values'? –

+0

Я должен написать одно и то же число «значений» для каждой строки, но я не знаю, сколько «значений» у меня есть перед запуском. –

+0

OK - но как только у вас есть 'resultRDD', вы можете предположить, что все записи имеют одинаковое количество значений? –

ответ

1

Если вы можете взять на себя все записи в resultRDD имеет одинаковое число столбцов в values - вы можете прочитать 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

Он работает как шарм, спасибо –

Смежные вопросы