2016-06-27 2 views
20

У меня есть следующее значение Scala:Как создать DataFrame из списка Iterables Scala?

val values: List[Iterable[Any]] = Traces().evaluate(features).toList 

, и я хочу, чтобы преобразовать его в DataFrame.

Когда я попробовать следующее:

sqlContext.createDataFrame(values) 

Я получил эту ошибку:

error: overloaded method value createDataFrame with alternatives: 

[A <: Product](data: Seq[A])(implicit evidence$2: reflect.runtime.universe.TypeTag[A])org.apache.spark.sql.DataFrame 
[A <: Product](rdd: org.apache.spark.rdd.RDD[A])(implicit evidence$1: reflect.runtime.universe.TypeTag[A])org.apache.spark.sql.DataFrame 
cannot be applied to (List[Iterable[Any]]) 
      sqlContext.createDataFrame(values) 

Почему?

+2

'Список [Iterable [Любой]]'? Вы этого не сделаете. Если значения могут быть выражены с использованием типов SQL, преобразуются в «List [Row]» и предоставляют схему. – zero323

ответ

19

Как указано zero323, мы должны сначала преобразовать List[Iterable[Any]] в List[Row], а затем поместить строки в RDD и подготовить схему для кадра данных искры.

Для преобразования List[Iterable[Any]] в List[Row], можно сказать,

val rows = values.map{x => Row(x:_*)} 

, а затем с схемы как schema, мы можем сделать RDD

val rdd = sparkContext.makeRDD[RDD](rows) 

и, наконец, создать рамку искры данных

val df = sqlContext.createDataFrame(rdd, schema) 
+1

Я предполагаю, что вы meants 'sparkContext.makeRDD [Row] (rows)'? –

5

В Spark 2 мы можем использовать DataSet, просто преобразуя li го по DS с помощью API TODS

val ds = list.flatMap(_.split(",")).toDS() // Records split by comma 

или

val ds = list.toDS() 

Это более удобно, чем rdd или df

+0

toDF() не работает в списке [List [Any]] – Antonin

16

То, что искра implicits объект для. Он позволяет конвертировать ваши общие типы коллекции scala в DataFrame/DataSet/RDD. Вот пример с Спарк 2.0, но она существует в более старые версии тоже

import org.apache.spark.sql.SparkSession 
val values = List(1,2,3,4,5) 

val spark = SparkSession.builder().master("local").getOrCreate() 
import spark.implicits._ 
val df = values.toDF() 

Edit: Просто понял, что вы были после 2-го списка. Вот что я попробовал на искровой оболочке. Я преобразовал 2d списка в список кортежей и используется неявное преобразование в DataFrame:

val values = List(List("1", "One") ,List("2", "Two") ,List("3", "Three"),List("4","4")).map(x =>(x(0), x(1))) 
import spark.implicits._ 
val df = values.toDF 

Edit2: Оригинальный вопрос МТТ был Как создать искру dataframe из списка лестницу для 2d списка, для которого это правильно ответ. Первоначальный вопрос: https://stackoverflow.com/revisions/38063195/1 Вопрос был изменен в соответствии с принятым ответом. Добавление этого редактирования так, что если кто-то ищет что-то похожее на исходный вопрос, он может его найти.

5

Простейшее подход:

val newList = yourList.map(Tuple1(_)) 
val df = spark.createDataFrame(newList).toDF("stuff") 
Смежные вопросы