2016-02-13 2 views
3

Я пытаюсь создать простой DataFrame следующим образом:Как создать образец dataframe в Scala/Спарк

import sqlContext.implicits._ 

val lookup = Array("one", "two", "three", "four", "five") 

val theRow = Array("1",Array(1,2,3), Array(0.1,0.4,0.5)) 

val theRdd = sc.makeRDD(theRow) 

case class X(id: String, indices: Array[Integer], weights: Array[Float]) 

val df = theRdd.map{ 
    case Array(s0,s1,s2) => X(s0.asInstanceOf[String],s1.asInstanceOf[Array[Integer]],s2.asInstanceOf[Array[Float]]) 
}.toDF() 

df.show() 

ДФ определяется как

df: org.apache.spark.sql.DataFrame = [id: string, indices: array<int>, weights: array<float>] 

который является то, что я хочу.

После выполнения я получаю

org.apache.spark.SparkException: Job aborted due to stage failure: Task 1 in stage 13.0 failed 1 times, most recent failure: Lost task 1.0 in stage 13.0 (TID 50, localhost): scala.MatchError: 1 (of class java.lang.String)

Где это MatchError приходит? И, есть ли более простой способ создать образец DataFrames программно?

ответ

2

Во-первых, theRow должен быть , а не Array. Теперь, если вы измените ваши типы таким образом, что совместимость между Java и Scala уважается, ваш пример будет работать

val theRow =Row("1",Array[java.lang.Integer](1,2,3), Array[Double](0.1,0.4,0.5)) 
val theRdd = sc.makeRDD(Array(theRow)) 
case class X(id: String, indices: Array[Integer], weights: Array[Double]) 
val df=theRdd.map{ 
    case Row(s0,s1,s2)=>X(s0.asInstanceOf[String],s1.asInstanceOf[Array[Integer]],s2.asInstanceOf[Array[Double]]) 
    }.toDF() 
df.show() 

//+---+---------+---------------+ 
//| id| indices|  weights| 
//+---+---------+---------------+ 
//| 1|[1, 2, 3]|[0.1, 0.4, 0.5]| 
//+---+---------+---------------+ 
+2

Обратите внимание, что вам нужно для 'импорта sqlContext.implicits._' для того, чтобы использовать' toDF ' – shakedzy

Смежные вопросы