Подтвердить что ты не робот

Как создать DataFrame из Scala Список 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)

Почему?

4b9b3361

Ответ 1

Как упоминалось 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)

Ответ 2

То, для чего предназначен объект spark implicits. Он позволяет конвертировать ваши общие типы коллекции scala в DataFrame/DataSet/RDD. Вот пример с Spark 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()

Изменить: просто понял, что вы после 2d-списка. Вот что я попробовал на искровой оболочке. Я преобразовал 2-й список в список кортежей и использовал неявное преобразование в 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: Первоначальный вопрос MTT состоял в том, как создать световой блок данных из списка scala для списка 2d, для которого это правильный ответ. Оригинальный вопрос: https://stackoverflow.com/revisions/38063195/1 Затем вопрос был изменен в соответствии с принятым ответом. Добавление этого редактирования так, что если кто-то ищет что-то похожее на исходный вопрос, он может его найти.

Ответ 3

Самый простой подход:

val newList = yourList.map(Tuple1(_))
val df = spark.createDataFrame(newList).toDF("stuff")

Ответ 4

В Spark 2 мы можем использовать DataSet путем простого преобразования списка в DS с помощью API-интерфейсов

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

или

val ds = list.toDS()

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