2016-06-27 20 views
20

Aşağıdaki Scala değere sahip:Scala'nın Iterables Listesinden DataFrame nasıl oluşturulur?

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

ve ben bir DataFrame dönüştürmek istiyoruz.

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) 

Neden:

sqlContext.createDataFrame(values) 

bu hata var: Ben aşağıdakileri deneyin

?

+2

'listesi [iterable [Herhangi]]'? Yapmıyorsun. Değerler SQL türleri kullanılarak ifade edilebilirse, 'List [Satır]' a dönüştürün ve şema sağlayın. – zero323

cevap

19

bahsedildiği zero323 olarak, en başta List[Row] için List[Iterable[Any]] dönüştürmek ve daha sonra RDD satırları koymak ve kıvılcım veri çerçeve için şema hazırlamak gerekir.

List[Row] için List[Iterable[Any]] dönüştürmek için, biz schema gibi olan şema, biz

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

RDD yapmak ve son olarak bir kıvılcım veri çerçevesini oluşturabilir ardından

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

diyebilecek

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

Sanırım siz 'sparkContext.makeRDD [Satır] (satır) 'mısın? –

5

Spark 2'de DataSet'i sadece li dönüştürerek kullanabiliriz Tods API tarafından DS st

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

veya

val ds = list.toDS() 

Bu daha uygun rdd veya daha

+0

toDF() Listede çalışmıyor [Liste [Herhangi]] – Antonin

16

df Thats Ne kıvılcım implicits nesne içindir. Ortak scala koleksiyonu türlerinizi DataFrame/DataSet/RDD'ye dönüştürmenize izin verir. İşte Spark 2.0 ile bir örnektir ama çok

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() 

Düzenleme eski sürümlerini var: Sadece 2d listesinden sonra olduğunu fark etti. İşte kıvılcım kabuğu üzerinde denediğim bir şey. Ben dizilerini Listesine bir 2d List dönüştürülür ve DataFrame için örtük dönüştürme kullandı:

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 ile özgün soru bu doğru olduğu bir 2d listesi için bir scala listeden kıvılcım dataframe oluşturmak için nasıl geçti Cevap. Orijinal soru https://stackoverflow.com/revisions/38063195/1 'dur. Soru daha sonra kabul edilen bir yanıtla eşleşecek şekilde değiştirildi. Bu düzenlemeyi ekleyerek, orijinal soruya benzer bir şey arayan başka bir kişi bulabilir.

5

En basit yaklaşım:

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