Как создать 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)
Почему?
Ответы
Ответ 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