2016-06-27 55 views
20

我有以下斯卡拉值:如何從Scala的Iterables列表創建DataFrame?

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

,我想將它轉化成一個數據幀。

當我嘗試以下方法:

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

'列表[可迭代[任何]'?你沒有。如果可以使用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 [行](行)'? –

5

在Spark 2中,我們可以使用DataSet,只需轉換li日至DS由TODS API

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

val ds = list.toDS() 

這更方便比rdddf

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

編輯:剛剛意識到你是2d後名單。這是我在火星殼上嘗試的東西。我轉換一個二維表,以元組的列表,並使用隱式轉換到數據幀:

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的列表中創建的火花數據幀的二維列單,這是一個正確回答。原來的問題是https://stackoverflow.com/revisions/38063195/1 問題後來改爲匹配接受的答案。添加此編輯,以便在其他人尋找類似於原始問題的人可以找到它時。

5

最簡單的方法:

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