it-swarm.com.ru

Как создать DataFrame из списка итераций Scala?

У меня есть следующее значение 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)

Зачем?

27
MTT

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

Чтобы преобразовать 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)
22
MTT

Вот для чего искра подразумевает объект. Это позволяет вам конвертировать ваши общие типы коллекции 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()

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

31
sparker

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

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

В Spark 2 мы можем использовать DataSet, просто преобразовав список в DS с помощью toDS API.

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

или же

val ds = list.toDS()

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

1
Nitin

Самый краткий способ, который я нашел:

val df = spark.createDataFrame(List("A", "B", "C").map(Tuple1(_)))
0
Viacheslav Shalamov